From b94b59818a801fede4014f988e142df5ac96aa81 Mon Sep 17 00:00:00 2001 From: Muhammad Abdullah Farooqui Date: Wed, 3 Dec 2025 15:34:01 +0100 Subject: [PATCH 01/11] update the demo to be compatible with ai-lab 4.4.0 --- ...casting.zip => sales_forecasting_demo.zip} | Bin 147733 -> 141063 bytes doc/examples/sales_forecasting/setup.rst | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename doc/examples/sales_forecasting/{sales_forecasting.zip => sales_forecasting_demo.zip} (83%) diff --git a/doc/examples/sales_forecasting/sales_forecasting.zip b/doc/examples/sales_forecasting/sales_forecasting_demo.zip similarity index 83% rename from doc/examples/sales_forecasting/sales_forecasting.zip rename to doc/examples/sales_forecasting/sales_forecasting_demo.zip index 1c0a82b6a333dbe32d3036a3e145f9a9a1ca3694..3f789a64b465cf72d371f3f2d51d32d1519d7755 100644 GIT binary patch delta 16305 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 diff --git a/doc/examples/sales_forecasting/setup.rst b/doc/examples/sales_forecasting/setup.rst index f01ac2f..4a4429d 100644 --- a/doc/examples/sales_forecasting/setup.rst +++ b/doc/examples/sales_forecasting/setup.rst @@ -23,7 +23,7 @@ If this is your first time using `AI-Lab `_, f Download the Sales Forecasting Demo File ------------------------------------------ -* :download:`Download the .zip file<./sales_forecasting.zip>`. +* :download:`Download the .zip file<./sales_forecasting_demo.zip>`. * **Extract** the contents of the .zip file using your file explorer. * **Create** a folder inside the root folder of AI-Lab and name it "sales_forecasting". * **Upload** the files inside extracted folder into the "sales_forecasting" folder. Using the import button on the top right. From f1e995bd851b9d9d1e4860ba9a37d1cc031ff8fe Mon Sep 17 00:00:00 2001 From: Muhammad Abdullah Farooqui Date: Wed, 3 Dec 2025 15:35:08 +0100 Subject: [PATCH 02/11] update the demo to be compatible with ai-lab 4.4.0 and removed the disclaimer --- doc/examples/sales_forecasting/index.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc/examples/sales_forecasting/index.rst b/doc/examples/sales_forecasting/index.rst index e114e04..21a91ef 100644 --- a/doc/examples/sales_forecasting/index.rst +++ b/doc/examples/sales_forecasting/index.rst @@ -8,8 +8,6 @@ Sales Forecasting setup.rst -**Disclaimer: This demo can only work with AI-LAB 3.3.0 at the moment.** - Overview ======== From 2e47f544498dcf7f7658baba0fc666df048099cf Mon Sep 17 00:00:00 2001 From: Muhammad Abdullah Farooqui Date: Wed, 3 Dec 2025 16:24:16 +0100 Subject: [PATCH 03/11] fixed sqlalchemy link in integration file --- doc/integrations.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/integrations.rst b/doc/integrations.rst index 28baf1a..ffe8a26 100644 --- a/doc/integrations.rst +++ b/doc/integrations.rst @@ -20,7 +20,7 @@ Connect to Exasol database using SQLAlchemy e = create_engine(url) r = e.execute("select 42 from dual").fetchall() -Please also refer to `sqlalchemy exasol documentation `_. +Please also refer to `sqlalchemy exasol documentation `_. JupySQL ------- From 3f1c9d17ed9f3273698e815aea9cd57e8f52596f Mon Sep 17 00:00:00 2001 From: Abdullah Farooqui Date: Tue, 31 Mar 2026 13:00:42 +0200 Subject: [PATCH 04/11] Add exasol-developer-guide-creator as a git submodule Co-Authored-By: Claude Sonnet 4.6 --- .gitmodules | 3 +++ skills/exasol-developer-guide-creator | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 skills/exasol-developer-guide-creator diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..7d6b760 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "skills/exasol-developer-guide-creator"] + path = skills/exasol-developer-guide-creator + url = https://github.com/exasol-labs/exasol-developer-guide-skills.git diff --git a/skills/exasol-developer-guide-creator b/skills/exasol-developer-guide-creator new file mode 160000 index 0000000..daddc1e --- /dev/null +++ b/skills/exasol-developer-guide-creator @@ -0,0 +1 @@ +Subproject commit daddc1ee5b3efedc0ac59a6e7c1effeda7e8d4d6 From d79ae69981b0fdf106091ab54b50a5b452c919be Mon Sep 17 00:00:00 2001 From: Abdullah Farooqui Date: Tue, 31 Mar 2026 14:34:28 +0200 Subject: [PATCH 05/11] Update exasol-developer-guide-creator submodule to marketplace-ready commit Co-Authored-By: Claude Sonnet 4.6 --- skills/exasol-developer-guide-creator | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skills/exasol-developer-guide-creator b/skills/exasol-developer-guide-creator index daddc1e..c08482e 160000 --- a/skills/exasol-developer-guide-creator +++ b/skills/exasol-developer-guide-creator @@ -1 +1 @@ -Subproject commit daddc1ee5b3efedc0ac59a6e7c1effeda7e8d4d6 +Subproject commit c08482e862e3d9274407e1b5cab02e2daef71dfe From 25cf33b2abca566f9a67bbcec26d4f575d486ed6 Mon Sep 17 00:00:00 2001 From: Abdullah Farooqui Date: Tue, 31 Mar 2026 15:18:33 +0200 Subject: [PATCH 06/11] Update exasol-developer-guide-creator submodule (README marketplace install) --- skills/exasol-developer-guide-creator | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skills/exasol-developer-guide-creator b/skills/exasol-developer-guide-creator index c08482e..4154d91 160000 --- a/skills/exasol-developer-guide-creator +++ b/skills/exasol-developer-guide-creator @@ -1 +1 @@ -Subproject commit c08482e862e3d9274407e1b5cab02e2daef71dfe +Subproject commit 4154d91c1089c7dae0d9da4e2dc4a7a53abfbd71 From 5b77a9ad3f156bb47f0f2f8792eb6822cafbbc20 Mon Sep 17 00:00:00 2001 From: Abdullah Farooqui Date: Wed, 1 Apr 2026 03:19:43 +0200 Subject: [PATCH 07/11] fixed modify and explore skill to not use absolute paths --- skills/.claude-plugin/plugin.json | 9 +++++++++ skills/.claude/settings.local.json | 10 ++++++++++ skills/exasol-developer-guide-creator | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 skills/.claude-plugin/plugin.json create mode 100644 skills/.claude/settings.local.json diff --git a/skills/.claude-plugin/plugin.json b/skills/.claude-plugin/plugin.json new file mode 100644 index 0000000..5b3e6d0 --- /dev/null +++ b/skills/.claude-plugin/plugin.json @@ -0,0 +1,9 @@ +{ + "name": "exasol-developer-guide-skills", + "description": "A plugin that provides skills to create and modify the Exasol Developer Guide.", + "version": "1.0.0", + "author": { + "name": "Muhammad Abdullah Farooqui" + }, + "repository": "https://github.com/exasol-labs/exasol-developer-guide-skills" +} diff --git a/skills/.claude/settings.local.json b/skills/.claude/settings.local.json new file mode 100644 index 0000000..31d8cde --- /dev/null +++ b/skills/.claude/settings.local.json @@ -0,0 +1,10 @@ +{ + "permissions": { + "allow": [ + "Bash(git:*)", + "Bash(gh pr:*)", + "WebFetch(domain:raw.githubusercontent.com)", + "Bash(grep -E '\\\\.\\(md|json\\)$')" + ] + } +} diff --git a/skills/exasol-developer-guide-creator b/skills/exasol-developer-guide-creator index 4154d91..1d8656f 160000 --- a/skills/exasol-developer-guide-creator +++ b/skills/exasol-developer-guide-creator @@ -1 +1 @@ -Subproject commit 4154d91c1089c7dae0d9da4e2dc4a7a53abfbd71 +Subproject commit 1d8656f7251c6d8e578d0c62cd97bc0f464924e2 From 598db775c949146f8df78ec06483e7933dd75266 Mon Sep 17 00:00:00 2001 From: Muhammad Abdullah Farooqui Date: Mon, 6 Jul 2026 21:24:14 +0200 Subject: [PATCH 08/11] Exasol Perosnal info --- .claude/settings.local.json | 10 +- .gitignore | 1 + .serena/.gitignore | 2 + .serena/project.yml | 133 +++++++++++++++++++++++ doc/exa_statistics/auditing.rst | 130 ++++++++++++++++++++++ doc/exa_statistics/index.rst | 36 ++++++ doc/exa_statistics/overview.rst | 102 +++++++++++++++++ doc/exa_statistics/query_analytics.rst | 124 +++++++++++++++++++++ doc/exa_statistics/system_health.rst | 124 +++++++++++++++++++++ doc/examples/sales_forecasting/setup.rst | 2 +- doc/gen_ai/ai_text_summary/index.rst | 11 +- doc/getting_started.rst | 47 +++++++- doc/index.rst | 1 + doc/integrations.rst | 6 +- skills/exasol-developer-guide-creator | 2 +- 15 files changed, 718 insertions(+), 13 deletions(-) create mode 100644 .serena/.gitignore create mode 100644 .serena/project.yml create mode 100644 doc/exa_statistics/auditing.rst create mode 100644 doc/exa_statistics/index.rst create mode 100644 doc/exa_statistics/overview.rst create mode 100644 doc/exa_statistics/query_analytics.rst create mode 100644 doc/exa_statistics/system_health.rst diff --git a/.claude/settings.local.json b/.claude/settings.local.json index f11cecb..a7a4912 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -16,7 +16,15 @@ "Bash(mv /c/Users/mufa/.claude/skills/exasol-explore /c/Users/mufa/.claude/skills/exasol-developer-guide-creator/)", "Bash(mv /c/Users/mufa/.claude/skills/exasol-new /c/Users/mufa/.claude/skills/exasol-developer-guide-creator/)", "Bash(mv /c/Users/mufa/.claude/skills/exasol-modify /c/Users/mufa/.claude/skills/exasol-developer-guide-creator/)", - "Bash(mv /c/Users/mufa/.claude/skills/exasol-implement /c/Users/mufa/.claude/skills/exasol-developer-guide-creator/)" + "Bash(mv /c/Users/mufa/.claude/skills/exasol-implement /c/Users/mufa/.claude/skills/exasol-developer-guide-creator/)", + "Bash(mkdir -p /c/Users/mufa/documents/developer-documentation/skills)", + "Bash(cp -r /c/Users/mufa/.claude/skills/exasol-developer-guide-creator /c/Users/mufa/documents/developer-documentation/skills/)", + "Bash(git -C /c/Users/mufa/.claude/skills/exasol-developer-guide-creator log --oneline)", + "Bash(git -C /c/Users/mufa/.claude/skills/exasol-developer-guide-creator remote -v)", + "Bash(git:*)", + "Skill(browse)", + "Bash('C:\\\\Users\\\\mufa/.claude/skills/gstack/browse/dist/browse' status *)", + "Bash(awk NR<=3 {print NR\": \"length\\($0\\)} *)" ] } } diff --git a/.gitignore b/.gitignore index fdcdf45..f90b6ab 100644 --- a/.gitignore +++ b/.gitignore @@ -147,3 +147,4 @@ itde/ # Emacs TAGS +.gstack/ diff --git a/.serena/.gitignore b/.serena/.gitignore new file mode 100644 index 0000000..2e510af --- /dev/null +++ b/.serena/.gitignore @@ -0,0 +1,2 @@ +/cache +/project.local.yml diff --git a/.serena/project.yml b/.serena/project.yml new file mode 100644 index 0000000..81ba91e --- /dev/null +++ b/.serena/project.yml @@ -0,0 +1,133 @@ +# the name by which the project can be referenced within Serena +project_name: "developer-documentation" + + +# list of languages for which language servers are started; choose from: +# al angular ansible bash clojure +# cpp cpp_ccls crystal csharp csharp_omnisharp +# dart elixir elm erlang fortran +# fsharp go groovy haskell haxe +# hlsl html java json julia +# kotlin lean4 lua luau markdown +# matlab msl nix ocaml pascal +# perl php php_phpactor powershell python +# python_jedi python_ty r rego ruby +# ruby_solargraph rust scala scss solidity +# svelte swift systemverilog terraform toml +# typescript typescript_vts vue yaml zig +# (This list may be outdated. For the current list, see values of Language enum here: +# https://github.com/oraios/serena/blob/main/src/solidlsp/ls_config.py +# For some languages, there are alternative language servers, e.g. csharp_omnisharp, ruby_solargraph.) +# Note: +# - For C, use cpp +# - For JavaScript, use typescript +# - For Angular projects, use angular (subsumes typescript+html; requires `npm install` in the project root) +# - For Svelte projects, use svelte (subsumes typescript/javascript for .svelte projects; requires npm) +# - For SCSS / Sass / plain CSS, use scss (some-sass-language-server handles all three) +# - For Free Pascal/Lazarus, use pascal +# Special requirements: +# Some languages require additional setup/installations. +# See here for details: https://oraios.github.io/serena/01-about/020_programming-languages.html#language-servers +# When using multiple languages, the first language server that supports a given file will be used for that file. +# The first language is the default language and the respective language server will be used as a fallback. +# Note that when using the JetBrains backend, language servers are not used and this list is correspondingly ignored. +languages: +- python + +# the encoding used by text files in the project +# For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings +encoding: "utf-8" + +# line ending convention to use when writing source files. +# Possible values: unset (use global setting), "lf", "crlf", or "native" (platform default) +# This does not affect Serena's own files (e.g. memories and configuration files), which always use native line endings. +line_ending: + +# The language backend to use for this project. +# If not set, the global setting from serena_config.yml is used. +# Valid values: LSP, JetBrains +# Note: the backend is fixed at startup. If a project with a different backend +# is activated post-init, an error will be returned. +language_backend: + +# whether to use project's .gitignore files to ignore files +ignore_all_files_in_gitignore: true + +# advanced configuration option allowing to configure language server-specific options. +# Maps the language key to the options. +# Have a look at the docstring of the constructors of the LS implementations within solidlsp (e.g., for C# or PHP) to see which options are available. +# No documentation on options means no options are available. +ls_specific_settings: {} + +# list of additional workspace folder paths for cross-package reference support (e.g. in monorepos). +# Paths can be absolute or relative to the project root. +# Each folder is registered as an LSP workspace folder, enabling language servers to discover +# symbols and references across package boundaries. +# Currently supported for: TypeScript. +# Example: +# additional_workspace_folders: +# - ../sibling-package +# - ../shared-lib +additional_workspace_folders: [] + +# list of additional paths to ignore in this project. +# Same syntax as gitignore, so you can use * and **. +# Note: global ignored_paths from serena_config.yml are also applied additively. +ignored_paths: [] + +# whether the project is in read-only mode +# If set to true, all editing tools will be disabled and attempts to use them will result in an error +# Added on 2025-04-18 +read_only: false + +# list of tool names to exclude. +# This extends the existing exclusions (e.g. from the global configuration) +# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html +excluded_tools: [] + +# list of tools to include that would otherwise be disabled (particularly optional tools that are disabled by default). +# This extends the existing inclusions (e.g. from the global configuration). +# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html +included_optional_tools: [] + +# fixed set of tools to use as the base tool set (if non-empty), replacing Serena's default set of tools. +# This cannot be combined with non-empty excluded_tools or included_optional_tools. +# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html +fixed_tools: [] + +# list of mode names that are to be activated by default, overriding the setting in the global configuration. +# The full set of modes to be activated is base_modes (from global config) + default_modes + added_modes. +# If the setting is undefined/empty, the default_modes from the global configuration (serena_config.yml) apply. +# Otherwise, this overrides the setting from the global configuration (serena_config.yml). +# Therefore, you can set this to [] if you do not want the default modes defined in the global config to apply +# for this project. +# This setting can, in turn, be overridden by CLI parameters (--mode). +# See https://oraios.github.io/serena/02-usage/050_configuration.html#modes +default_modes: + +# list of mode names to be activated additionally for this project, e.g. ["query-projects"] +# The full set of modes to be activated is base_modes (from global config) + default_modes + added_modes. +# See https://oraios.github.io/serena/02-usage/050_configuration.html#modes +added_modes: + +# initial prompt for the project. It will always be given to the LLM upon activating the project +# (contrary to the memories, which are loaded on demand). +initial_prompt: "" + +# time budget (seconds) per tool call for the retrieval of additional symbol information +# such as docstrings or parameter information. +# This overrides the corresponding setting in the global configuration; see the documentation there. +# If null or missing, use the setting from the global configuration. +symbol_info_budget: + +# list of regex patterns which, when matched, mark a memory entry as read‑only. +# Extends the list from the global configuration, merging the two lists. +read_only_memory_patterns: [] + +# list of regex patterns for memories to completely ignore. +# Matching memories will not appear in list_memories or activate_project output +# and cannot be accessed via read_memory or write_memory. +# To access ignored memory files, use the read_file tool on the raw file path. +# Extends the list from the global configuration, merging the two lists. +# Example: ["_archive/.*", "_episodes/.*"] +ignored_memory_patterns: [] diff --git a/doc/exa_statistics/auditing.rst b/doc/exa_statistics/auditing.rst new file mode 100644 index 0000000..772054d --- /dev/null +++ b/doc/exa_statistics/auditing.rst @@ -0,0 +1,130 @@ +====================== +Auditing & Compliance +====================== + +The ``EXA_DBA_AUDIT_*`` tables provide a full audit trail of SQL execution and user sessions. +They are designed for security investigations, compliance reporting, and operational support. + +.. note:: + All tables in this section require the ``SELECT ANY DICTIONARY`` system privilege. + See :ref:`exa-statistics-access-control` for details on granting this privilege. + +EXA_DBA_AUDIT_SQL +================== + +Records every SQL statement executed in the database. Key columns: + +.. list-table:: + :header-rows: 1 + :widths: 30 70 + + * - Column + - Description + * - ``USER_NAME`` + - Database user who executed the statement + * - ``SESSION_ID`` + - Session identifier + * - ``STMT_ID`` + - Statement identifier within the session + * - ``COMMAND_NAME`` + - SQL command type (e.g., ``SELECT``, ``CREATE TABLE``) + * - ``COMMAND_CLASS`` + - Broad category: ``DQL``, ``DML``, ``DDL``, ``DCL``, ``TCL`` + * - ``SQL_TEXT`` + - Full SQL text (up to 2,000,000 characters) + * - ``SUCCESS`` + - ``TRUE`` if the statement completed without error + * - ``ERROR_CODE`` / ``ERROR_TEXT`` + - Error details for failed statements + * - ``DURATION`` + - Execution time in seconds + * - ``STMT_START_TIME`` + - Timestamp when the statement began executing + +EXA_DBA_AUDIT_SESSIONS +======================== + +Records every database session, including login and logout events. Key columns: + +.. list-table:: + :header-rows: 1 + :widths: 30 70 + + * - Column + - Description + * - ``SESSION_ID`` + - Unique session identifier + * - ``USER_NAME`` + - Database user who opened the session + * - ``OS_USER`` + - Operating system user on the client machine + * - ``HOST`` + - Client host address + * - ``LOGIN_TIME`` + - Session start timestamp + * - ``LOGOUT_TIME`` + - Session end timestamp (``NULL`` if session is still active) + * - ``SUCCESS`` + - ``TRUE`` for successful logins; ``FALSE`` for failed login attempts + * - ``ENCRYPTED`` + - ``TRUE`` if the connection was encrypted + +Managing Audit Log Size +======================== + +Audit tables grow continuously. Remove old records while retaining recent history with +``TRUNCATE AUDIT LOGS``: + +.. code-block:: sql + + -- Keep the last 30 days; remove everything older + TRUNCATE AUDIT LOGS KEEP FROM DAYS=30; + +.. warning:: + ``TRUNCATE AUDIT LOGS`` permanently deletes the removed records. This action cannot be undone. + +Recipes +======= + +Find All Failed Statements with Error Details +---------------------------------------------- + +.. code-block:: sql + + SELECT USER_NAME, COMMAND_NAME, SQL_TEXT, + ERROR_CODE, ERROR_TEXT, STMT_START_TIME + FROM EXA_DBA_AUDIT_SQL + WHERE SUCCESS = FALSE + ORDER BY STMT_START_TIME DESC + LIMIT 50; + +Track Login History for a Specific User +----------------------------------------- + +.. code-block:: sql + + SELECT SESSION_ID, LOGIN_TIME, LOGOUT_TIME, + HOST, OS_USER, ENCRYPTED + FROM EXA_DBA_AUDIT_SESSIONS + WHERE USER_NAME = 'MY_USER' + ORDER BY LOGIN_TIME DESC; + +List All DDL Statements Executed Today +---------------------------------------- + +.. code-block:: sql + + SELECT USER_NAME, COMMAND_NAME, SQL_TEXT, STMT_START_TIME + FROM EXA_DBA_AUDIT_SQL + WHERE COMMAND_CLASS = 'DDL' + AND CAST(STMT_START_TIME AS DATE) = CURRENT_DATE + ORDER BY STMT_START_TIME DESC; + +Remove Audit Logs Older Than 30 Days +-------------------------------------- + +.. code-block:: sql + + TRUNCATE AUDIT LOGS KEEP FROM DAYS=30; + +**Further reading:** `EXA_DBA_AUDIT_SQL `_ · `EXA_DBA_AUDIT_SESSIONS `_ · `Auditing Concepts `_ diff --git a/doc/exa_statistics/index.rst b/doc/exa_statistics/index.rst new file mode 100644 index 0000000..e267d81 --- /dev/null +++ b/doc/exa_statistics/index.rst @@ -0,0 +1,36 @@ +=========================================== +EXA_STATISTICS: Database Monitoring & Audit +=========================================== + +``EXA_STATISTICS`` is a built-in system schema present in every Exasol database. It automatically +collects and stores historical data about query activity, resource usage, database size, and user +sessions. Use it to monitor performance, plan capacity, and maintain a full audit trail — without +installing any additional tools. + +.. list-table:: Table Groups at a Glance + :header-rows: 1 + :widths: 25 50 25 + + * - Group + - Purpose + - Access + * - SQL Activity (``EXA_SQL_*``) + - Track executed statements, execution modes, duration, and CPU usage + - All users + * - System Monitor (``EXA_MONITOR_*``) + - Monitor CPU, memory, swap, I/O, and network metrics + - All users + * - Database Size (``EXA_DB_SIZE_*``) + - Track storage volume, compression ratios, and recommended RAM + - All users + * - Audit (``EXA_DBA_AUDIT_*``) + - Full SQL and session audit trail for compliance and security + - ``SELECT ANY DICTIONARY`` required + +.. toctree:: + :maxdepth: 2 + + overview + query_analytics + system_health + auditing diff --git a/doc/exa_statistics/overview.rst b/doc/exa_statistics/overview.rst new file mode 100644 index 0000000..f1c17c7 --- /dev/null +++ b/doc/exa_statistics/overview.rst @@ -0,0 +1,102 @@ +======== +Overview +======== + +What is EXA_STATISTICS +======================= + +``EXA_STATISTICS`` is a system schema built into every Exasol database. It continuously collects +statistics about SQL execution, hardware resource usage, storage, and user sessions. Data is updated +automatically every minute and is immediately available for querying — no configuration required. + +The schema covers four functional areas: + +* **SQL Activity** — historical record of every executed statement +* **System Monitor** — CPU, memory, I/O, and network metrics over time +* **Database Size** — storage volume, compression ratios, and RAM recommendations +* **Audit** — full audit trail of SQL statements and user sessions + +Namespace Integration +===================== + +``EXA_STATISTICS`` and ``SYS`` are automatically integrated into Exasol's namespace. You can query +statistical tables directly without specifying the schema name: + +.. code-block:: sql + + -- Both are equivalent: + SELECT * FROM EXA_SQL_LAST_DAY; + SELECT * FROM EXA_STATISTICS.EXA_SQL_LAST_DAY; + +.. _exa-statistics-access-control: + +Access Control +============== + +Most statistical tables are readable by all database users. Tables with ``DBA`` in their name +contain sensitive data and require the ``SELECT ANY DICTIONARY`` system privilege. + +.. list-table:: + :header-rows: 1 + :widths: 45 55 + + * - Table Group + - Required Privilege + * - ``EXA_SQL_*``, ``EXA_MONITOR_*``, ``EXA_DB_SIZE_*`` + - None — any connected user + * - ``EXA_DBA_AUDIT_*`` + - ``SELECT ANY DICTIONARY`` + +To grant the privilege to a user: + +.. code-block:: sql + + GRANT SELECT ANY DICTIONARY TO my_user; + +Aggregation Levels +================== + +Each metric category is available at multiple time granularities: + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + + * - Suffix + - Description + * - ``_LAST_DAY`` + - Rolling 24-hour window — one row per measurement interval + * - ``_HOURLY`` + - Aggregated per hour + * - ``_DAILY`` + - Aggregated per calendar day + * - ``_MONTHLY`` + - Aggregated per calendar month + +Use ``_LAST_DAY`` tables for real-time investigation and the aggregated tables for trend analysis +and capacity planning. + +Time Zone +========= + +All timestamps in ``EXA_STATISTICS`` are stored in the database's configured time zone +(``DBTIMEZONE``). To check your current setting: + +.. code-block:: sql + + SELECT DBTIMEZONE; + +Refreshing Statistics +===================== + +Statistics are updated automatically every minute. To force an immediate refresh: + +.. code-block:: sql + + FLUSH STATISTICS; + COMMIT; + +.. note:: + Open a new transaction after flushing to see the latest data reflected in your queries. + +**Further reading:** `Statistical System Tables `_ · `FLUSH STATISTICS `_ diff --git a/doc/exa_statistics/query_analytics.rst b/doc/exa_statistics/query_analytics.rst new file mode 100644 index 0000000..87e25b6 --- /dev/null +++ b/doc/exa_statistics/query_analytics.rst @@ -0,0 +1,124 @@ +=========================== +Query Performance Analytics +=========================== + +The ``EXA_SQL_*`` tables record every SQL statement that Exasol successfully compiles and executes. +Use them to identify slow queries, measure CPU consumption, and understand workload patterns over time. + +EXA_SQL_LAST_DAY +================ + +Contains one row per executed statement within the rolling 24-hour window. Key columns: + +.. list-table:: + :header-rows: 1 + :widths: 30 70 + + * - Column + - Description + * - ``SESSION_ID`` + - Identifier of the session that ran the statement + * - ``STMT_ID`` + - Statement identifier within the session + * - ``COMMAND_NAME`` + - SQL command type (e.g., ``SELECT``, ``INSERT``, ``COMMIT``) + * - ``EXECUTION_MODE`` + - How the statement was handled — see Execution Modes below + * - ``DURATION`` + - Execution time in seconds + * - ``CPU`` + - CPU usage percentage during execution + * - ``SUCCESS`` + - ``TRUE`` if the statement completed without error + * - ``START_TIME`` / ``STOP_TIME`` + - Execution window timestamps + * - ``TEMP_DB_RAM_PEAK`` + - Peak temporary memory used (bytes) + +.. note:: + ``EXA_SQL_LAST_DAY`` does not record the SQL text or the executing user name. For the full audit + trail including SQL text, see ``EXA_DBA_AUDIT_SQL`` in :doc:`auditing`. + +EXA_SQL_DAILY and EXA_SQL_HOURLY +================================= + +Aggregated views of SQL activity. Each row represents a command type (``SELECT``, ``MERGE``, etc.) +within a time period. Key aggregated columns include ``COUNT``, ``DURATION_AVG``, ``DURATION_MAX``, +``CPU_AVG``, and ``CPU_MAX``. + +Use these tables to spot workload trends without scanning per-statement detail. + +Execution Modes +=============== + +The ``EXECUTION_MODE`` column classifies how each statement was handled: + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + + * - Mode + - Meaning + * - ``EXECUTE`` + - Statement was fully compiled and executed + * - ``PREPARE`` + - Statement was prepared but not yet executed + * - ``CACHED`` + - Result was served from the query cache — no recomputation + * - ``CRASHED`` + - Statement failed during execution + +Recipes +======= + +Find the Slowest Queries (Last 24 Hours) +----------------------------------------- + +.. code-block:: sql + + SELECT SESSION_ID, STMT_ID, COMMAND_NAME, DURATION, SUCCESS + FROM EXA_SQL_LAST_DAY + ORDER BY DURATION DESC + LIMIT 20; + +Identify CPU-Intensive Statements +----------------------------------- + +.. code-block:: sql + + SELECT SESSION_ID, STMT_ID, COMMAND_NAME, CPU, DURATION + FROM EXA_SQL_LAST_DAY + WHERE CPU > 50 + ORDER BY CPU DESC; + +Check Cache Hit Rate +--------------------- + +A high proportion of ``CACHED`` executions indicates effective use of Exasol's query cache. + +.. code-block:: sql + + WITH totals AS ( + SELECT EXECUTION_MODE, COUNT(*) AS statement_count + FROM EXA_SQL_LAST_DAY + GROUP BY EXECUTION_MODE + ) + SELECT + EXECUTION_MODE, + statement_count, + ROUND(statement_count * 100.0 / SUM(statement_count) OVER (), 1) AS pct + FROM totals + ORDER BY statement_count DESC; + +Daily Workload Summary by Command Type +---------------------------------------- + +.. code-block:: sql + + SELECT COMMAND_NAME, COUNT AS statement_count, + DURATION_AVG, DURATION_MAX + FROM EXA_SQL_DAILY + WHERE SUCCESS = TRUE + ORDER BY DURATION_MAX DESC; + +**Further reading:** `EXA_SQL_LAST_DAY `_ · `EXA_SQL_DAILY `_ diff --git a/doc/exa_statistics/system_health.rst b/doc/exa_statistics/system_health.rst new file mode 100644 index 0000000..79534e8 --- /dev/null +++ b/doc/exa_statistics/system_health.rst @@ -0,0 +1,124 @@ +================================= +System Health & Capacity Planning +================================= + +The ``EXA_MONITOR_*`` and ``EXA_DB_SIZE_*`` tables provide a continuous record of hardware resource +usage and storage consumption. Use them to detect performance bottlenecks, identify memory pressure, +and plan infrastructure growth. + +EXA_MONITOR_LAST_DAY +===================== + +Contains one row per measurement interval (approximately every minute) for the past 24 hours. +Key columns: + +.. list-table:: + :header-rows: 1 + :widths: 30 70 + + * - Column + - Description + * - ``MEASURE_TIME`` + - Timestamp of the measurement + * - ``CPU`` + - Average CPU usage across all cluster nodes (%) + * - ``LOAD`` + - System load average + * - ``TEMP_DB_RAM`` + - Temporary DB RAM in use (MiB) + * - ``PERSISTENT_DB_RAM`` + - Persistent DB RAM in use (MiB) + * - ``SWAP`` + - Swap space in use — values above 0 indicate memory pressure (MiB) + * - ``HDD_READ`` / ``HDD_WRITE`` + - Disk read/write throughput (MiB/s) + * - ``NET`` + - Network traffic (MiB/s) + +EXA_MONITOR_DAILY +================== + +Aggregates monitor data per calendar day. Each metric has both an ``_AVG`` and ``_MAX`` variant +(e.g., ``CPU_AVG``, ``CPU_MAX``). Use this table to identify days with unusual load or to compare +weekly performance trends. + +EXA_DB_SIZE_LAST_DAY +===================== + +Tracks storage volume metrics at the cluster level, measured approximately every hour. Key columns: + +.. list-table:: + :header-rows: 1 + :widths: 40 60 + + * - Column + - Description + * - ``SIZE_RAW_COMPRESSED`` + - Compressed data volume (MiB) + * - ``SIZE_UNCOMPRESSED`` + - Uncompressed (raw) data volume (MiB) + * - ``RECOMMENDED_DB_RAM_SIZE`` + - RAM size Exasol recommends for optimal query performance (MiB) + * - ``SIZE_PERSISTENT_VOLUME`` + - Total persistent storage allocated (MiB) + * - ``SIZE_PERSISTENT_VOLUME_PERCENTAGE`` + - Percentage of persistent volume currently used + +EXA_DB_SIZE_DAILY +================== + +Daily aggregation of database size metrics. Use this table to track storage growth over weeks and +months and to feed capacity planning reports. + +Recipes +======= + +Snapshot Current System Resource Usage +---------------------------------------- + +.. code-block:: sql + + SELECT MEASURE_TIME, CPU, LOAD, TEMP_DB_RAM, PERSISTENT_DB_RAM, SWAP + FROM EXA_MONITOR_LAST_DAY + ORDER BY MEASURE_TIME DESC + LIMIT 10; + +Detect Memory Pressure +----------------------- + +Swap usage above zero suggests the database is under memory pressure. Sustained swap values +warrant a RAM review or workload optimisation. + +.. code-block:: sql + + SELECT MEASURE_TIME, SWAP, CPU, TEMP_DB_RAM + FROM EXA_MONITOR_LAST_DAY + WHERE SWAP > 0 + ORDER BY MEASURE_TIME DESC; + +Check Storage Utilization and Recommended RAM +---------------------------------------------- + +.. code-block:: sql + + SELECT MEASURE_TIME, + SIZE_RAW_COMPRESSED, + SIZE_PERSISTENT_VOLUME, + SIZE_PERSISTENT_VOLUME_PERCENTAGE, + RECOMMENDED_DB_RAM_SIZE + FROM EXA_DB_SIZE_LAST_DAY + ORDER BY MEASURE_TIME DESC + LIMIT 1; + +Track Storage Growth Over the Last Two Weeks +--------------------------------------------- + +.. code-block:: sql + + SELECT MEASURE_TIME, + SIZE_RAW_COMPRESSED + FROM EXA_DB_SIZE_DAILY + ORDER BY MEASURE_TIME DESC + LIMIT 14; + +**Further reading:** `EXA_MONITOR_LAST_DAY `_ · `EXA_MONITOR_DAILY `_ · `EXA_DB_SIZE_LAST_DAY `_ diff --git a/doc/examples/sales_forecasting/setup.rst b/doc/examples/sales_forecasting/setup.rst index 4a4429d..92273f4 100644 --- a/doc/examples/sales_forecasting/setup.rst +++ b/doc/examples/sales_forecasting/setup.rst @@ -4,7 +4,7 @@ Setup ====== -You will be needing `AI-Lab `_ and an Exasol database. You can use the Docker DB that comes with AI-Lab or an onPrem one. +You will be needing `AI-Lab `_ and an Exasol database. You can use the Docker DB that comes with AI-Lab or an onPrem one. A free `Exasol Personal `_ deployment (see :doc:`/getting_started`) also works — connect to it using the On-Prem option. Once you have finished setting up with `AI-Lab `_, we can proceed. diff --git a/doc/gen_ai/ai_text_summary/index.rst b/doc/gen_ai/ai_text_summary/index.rst index d9ec176..12a89b6 100644 --- a/doc/gen_ai/ai_text_summary/index.rst +++ b/doc/gen_ai/ai_text_summary/index.rst @@ -56,10 +56,19 @@ Prerequisites Step 1: Start Exasol Database ============================== -If you don't have an Exasol database running, set one up quickly using Docker. +If you don't have an Exasol database running, set one up quickly using Docker. Exasol provides a free Docker image for development and testing which supports up to 10GB of data (plenty for this tutorial). Full instructions for deploying the Exasol Docker image can be found in the `Exasol Docker repository `_. +.. note:: + + As an alternative to Docker, you can use `Exasol Personal `_ — + a completely free, full-featured edition of Exasol that you can install locally (macOS) or in + your own cloud with a single command, with no limits on data size. Like the Docker setup, your + data never leaves your own infrastructure, which fits the self-hosted approach of this tutorial. + See :doc:`/getting_started` for setup instructions. The default local credentials (``sys`` / ``exasol``) + are the same as for the Docker image. + Run Exasol in Docker: .. code-block:: bash diff --git a/doc/getting_started.rst b/doc/getting_started.rst index 1ab210b..ac5653b 100644 --- a/doc/getting_started.rst +++ b/doc/getting_started.rst @@ -2,19 +2,54 @@ Getting Started =============== -There are three ways to get started with Exasol: +There are four ways to get started with Exasol: +- Install `Exasol Personal `__ — the + full Exasol database, completely free for personal use - Download the `community edition `__ - Use the `docker version `__ - Signup for a free `SaaS trial `__ -In the following we are going to use the SaaS version. +In the following we are going to use Exasol Personal. -Setting up the db +Setting up the DB ----------------- -Our `main +`Exasol Personal `__ is a completely +free, single-user edition of Exasol with all enterprise features +included — unlimited data, unlimited cluster size (MPP), UDFs, and the +Exasol Admin web UI. You can run it locally on your own machine +(currently macOS with at least 8 GB RAM) or deploy it into your own +cloud account (AWS, Azure, Exoscale, or STACKIT). + +First, download the Exasol Launcher (Linux / macOS): + +.. code:: bash + + curl https://downloads.exasol.com/exasol-personal/installer.sh | sh + +Then install Exasol Personal on your local system or in the cloud of +your choice: + +.. code:: bash + + exasol install local # local system, macOS + exasol install aws # Amazon Web Services + exasol install azure # Microsoft Azure + exasol install exoscale # Exoscale + exasol install stackit # STACKIT + +A cloud deployment takes about 10 to 20 minutes. Once the installation +has finished, run ``exasol info`` to see how to connect to your +database. For local deployments the initial credentials are ``sys`` / +``exasol``. For Windows installation, sample data, and full details see +the `Exasol Personal +repository `__ and the +`Quick Start +Guide `__. + +Alternatively, if you prefer a managed database, our `main documentation `__ shows you how to create a SaaS account and setup your first database and cluster. @@ -41,6 +76,10 @@ Connecting to an Exasol database is performed via: C = pyexasol.connect(dsn='', user='sys', password='exasol') +For Exasol Personal, ``exasol info`` shows the connection details of +your deployment; ``sys`` / ``exasol`` are the defaults for a local +deployment. + It is slightly different when connecting to a SaaS database as we need a `personal access token `__: diff --git a/doc/index.rst b/doc/index.rst index 873fe9b..7257d3d 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -16,6 +16,7 @@ Documentation and resources for data scientists and programmatic users to perfor examples/index.rst environments integrations + exa_statistics/index.rst faq how_edit_this_docu changes/changelog diff --git a/doc/integrations.rst b/doc/integrations.rst index 2d14394..d66cdaf 100644 --- a/doc/integrations.rst +++ b/doc/integrations.rst @@ -1,5 +1,5 @@ Integrations -============ +============= SQLAlchemy ---------- @@ -17,9 +17,6 @@ Connect to Exasol database using SQLAlchemy from sqlalchemy import create_engine, text, URL -<<<<<<< HEAD -Please also refer to `sqlalchemy exasol documentation `_. -======= url_object = URL.create( drivername="exa+websocket", username="sys", @@ -35,7 +32,6 @@ Please also refer to `sqlalchemy exasol documentation `_. ->>>>>>> b1c87029d51dffe3510a34501af9eb4acbae6b8b JupySQL ------- diff --git a/skills/exasol-developer-guide-creator b/skills/exasol-developer-guide-creator index 1d8656f..f249a65 160000 --- a/skills/exasol-developer-guide-creator +++ b/skills/exasol-developer-guide-creator @@ -1 +1 @@ -Subproject commit 1d8656f7251c6d8e578d0c62cd97bc0f464924e2 +Subproject commit f249a654a3fb5f73cad7a948e451ae71e62f5aa0 From aca851c3efbb29e99ae56fbdc28e5fa0b767a5d0 Mon Sep 17 00:00:00 2001 From: Muhammad Abdullah Farooqui Date: Mon, 6 Jul 2026 21:32:26 +0200 Subject: [PATCH 09/11] removed agent files --- .claude/settings.local.json | 30 ----- .claude/skills/exasol-explore.md | 91 -------------- .claude/skills/exasol-implement.md | 188 ----------------------------- .claude/skills/exasol-modify.md | 114 ----------------- .claude/skills/exasol-new.md | 131 -------------------- .gitignore | 4 + .serena/.gitignore | 2 - .serena/project.yml | 133 -------------------- skills/.claude/settings.local.json | 10 -- 9 files changed, 4 insertions(+), 699 deletions(-) delete mode 100644 .claude/settings.local.json delete mode 100644 .claude/skills/exasol-explore.md delete mode 100644 .claude/skills/exasol-implement.md delete mode 100644 .claude/skills/exasol-modify.md delete mode 100644 .claude/skills/exasol-new.md delete mode 100644 .serena/.gitignore delete mode 100644 .serena/project.yml delete mode 100644 skills/.claude/settings.local.json diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index a7a4912..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "permissions": { - "allow": [ - "WebFetch(domain:github.com)", - "WebFetch(domain:www.npmjs.com)", - "Read(//c/Users/mufa/documents/developer-documentation/$APPDATA/Claude/**)", - "Read(//c/Users/mufa/documents/developer-documentation/$HOME/AppData/Roaming/Claude/**)", - "Bash(claude mcp:*)", - "Bash(python3 -c \"import json,sys; d=json.load\\(sys.stdin\\); print\\(json.dumps\\(list\\(d.keys\\(\\)\\), indent=2\\)\\)\")", - "Bash(python3:*)", - "mcp__exasol_db__list_schemas", - "mcp__exasol_db__list_tables", - "Read(//c/Users/mufa/.claude/skills//**)", - "Read(//c/Users/mufa/.claude//**)", - "Bash(mkdir -p /c/Users/mufa/.claude/skills/exasol-developer-guide-creator)", - "Bash(mv /c/Users/mufa/.claude/skills/exasol-explore /c/Users/mufa/.claude/skills/exasol-developer-guide-creator/)", - "Bash(mv /c/Users/mufa/.claude/skills/exasol-new /c/Users/mufa/.claude/skills/exasol-developer-guide-creator/)", - "Bash(mv /c/Users/mufa/.claude/skills/exasol-modify /c/Users/mufa/.claude/skills/exasol-developer-guide-creator/)", - "Bash(mv /c/Users/mufa/.claude/skills/exasol-implement /c/Users/mufa/.claude/skills/exasol-developer-guide-creator/)", - "Bash(mkdir -p /c/Users/mufa/documents/developer-documentation/skills)", - "Bash(cp -r /c/Users/mufa/.claude/skills/exasol-developer-guide-creator /c/Users/mufa/documents/developer-documentation/skills/)", - "Bash(git -C /c/Users/mufa/.claude/skills/exasol-developer-guide-creator log --oneline)", - "Bash(git -C /c/Users/mufa/.claude/skills/exasol-developer-guide-creator remote -v)", - "Bash(git:*)", - "Skill(browse)", - "Bash('C:\\\\Users\\\\mufa/.claude/skills/gstack/browse/dist/browse' status *)", - "Bash(awk NR<=3 {print NR\": \"length\\($0\\)} *)" - ] - } -} diff --git a/.claude/skills/exasol-explore.md b/.claude/skills/exasol-explore.md deleted file mode 100644 index 3352634..0000000 --- a/.claude/skills/exasol-explore.md +++ /dev/null @@ -1,91 +0,0 @@ -# Exasol Developer Guide — Explore & Audit - -Crawl the existing developer guide, surface improvement opportunities, and co-create an action plan with the user through interactive Q&A. - ---- - -## Context - -- **Project path:** `C:\Users\mufa\documents\developer-documentation` -- **Docs root:** `doc/` -- **File format:** reStructuredText (`.rst`) rendered by Sphinx -- **Target audience:** Data professionals and developers — professional but accessible -- **Gold standard sections:** `doc/connect_to_exasol/` and `doc/gen_ai/ai_text_summary/` - ---- - -## Step 1 — Explore the Project - -Read the following in parallel using Glob and Read tools: -- Full folder/file tree of `doc/` (use Glob with `doc/**/*`) -- `doc/index.rst` — top-level toctree -- Every `index.rst` inside section subfolders -- 2–3 representative content files per section (pick the most substantial ones) - -Do NOT skip any section folder. Read actual file contents, not just filenames. - ---- - -## Step 2 — Assess Each Section - -Evaluate every section against the developer guide standard: - -**Expected structure per section:** -1. **What** — Clear definition: what the feature/tool is, why it exists -2. **How** — Step-by-step implementation with working, copy-paste-ready code examples -3. **Benefits + Real-world use cases** — Practical scenarios, when to use it, what it enables - -**Quality checklist per section:** -- Is the tone professional but accessible? Not overwhelming, not condescending. -- Are prerequisites clearly stated before any steps? -- Are code examples present and complete (not just snippets)? -- Is information up to date (no outdated version references)? -- Are there cross-references to related sections? -- Is complexity appropriate — does it avoid dumping advanced detail on beginners? -- Does it follow the What → How → Benefits structure? - ---- - -## Step 3 — Interactive Q&A - -Present your findings to the user in this structure: - -**1. Current state** -Table or list of all sections with a brief quality rating (Good / Needs Work / Incomplete / Missing). - -**2. Gaps identified** -Features or tools that exist in the Exasol ecosystem but have no section yet. - -**3. Specific improvement areas** -Be concrete — e.g., "UDF/debugging.rst is only one sentence, needs a real debugging walkthrough" or "connect_to_exasol/connection.rst has no error handling example." - -**4. Ranked suggestions** -List improvements ordered by impact (high / medium / low). - -Then ask the user targeted questions to understand priorities: -- Which of these improvements matters most right now? -- Are there specific features or connectors they want to document next? -- Any sections they want to fully restructure vs. just expand? -- Anything they want to remove or consolidate? - -Wait for user responses before proceeding. - ---- - -## Step 4 — Sketch the Plan - -Based on the Q&A responses, produce a concrete action plan: - -For each proposed change, state: -- Section name and file(s) affected -- Type of change: **new section** / **add content** / **restructure** / **simplify** -- Brief description of what will change and why -- Priority: High / Medium / Low - -Group by priority. Note which changes can be directly executed with `/exasol-implement` (content additions, modifications) versus which need a planning session first with `/exasol-new` (entirely new sections) or `/exasol-modify` (structural overhaul). - ---- - -## Important - -Do NOT write any files during this skill. This skill is exploration and planning only. diff --git a/.claude/skills/exasol-implement.md b/.claude/skills/exasol-implement.md deleted file mode 100644 index fe5e362..0000000 --- a/.claude/skills/exasol-implement.md +++ /dev/null @@ -1,188 +0,0 @@ -# Exasol Developer Guide — Implement - -Write RST files to disk based on a plan produced by `/exasol-new` or `/exasol-modify`. - -## Prerequisites - -A plan **must already exist** in this conversation from running `/exasol-new` or `/exasol-modify`. -If no plan is present, respond: "No plan found. Please run `/exasol-new` or `/exasol-modify` first." - ---- - -## Context - -- **Project path:** `C:\Users\mufa\documents\developer-documentation` -- **Docs root:** `doc/` -- **File format:** reStructuredText (`.rst`) rendered by Sphinx -- **Target audience:** Data professionals and developers — professional but accessible -- **Standard structure:** What → How (step-by-step with code) → Benefits + Real-world use cases + Examples - ---- - -## Step 1 — Confirm - -Summarise what will be written or modified based on the plan. List: -- Files to be created (with paths) -- Files to be modified (with paths) -- Toctree entries to be added - -Ask: "Ready to implement — shall I proceed?" - -Wait for confirmation before writing anything. - ---- - -## Step 2 — Implement Each File - -Write or edit each file according to the plan. Strictly follow the RST conventions below. - ---- - -### RST Formatting Rules - -#### Heading Levels - -```rst -=================== -Document Title (H1) -=================== - -Section Heading (H2) -==================== - -Subsection Heading (H3) ------------------------ - -Sub-subsection (H4) -^^^^^^^^^^^^^^^^^^^ -``` - -- H1 (document title): overline AND underline with `=` -- H2 (major sections): underline only with `=` -- H3 (subsections): underline with `-` -- H4 (sub-subsections): underline with `^` -- The overline/underline must be **at least as long as the text** - -#### Code Blocks - -```rst -.. code-block:: python - - import pyexasol - connection = pyexasol.connect(dsn='host:port', user='sys', password='exasol') -``` - -Always specify the language: `python`, `sql`, `bash`, `text`, `json`. -Indent code content by **4 spaces** inside the directive. - -#### Notes and Warnings - -```rst -.. note:: - Text here, indented 3 spaces. - -.. warning:: - Text here. - -.. important:: - Text here. -``` - -#### Tables - -```rst -.. list-table:: Optional Title - :header-rows: 1 - :widths: 25 75 - - * - Column One - - Column Two - * - Row value - - Row value -``` - -#### Links - -```rst -`Link text `_ -``` - -#### Internal Cross-References - -```rst -.. _my-label: - -Section Title -============= - -(elsewhere in the docs) -:ref:`my-label` -``` - -#### Toctree - -```rst -.. toctree:: - :maxdepth: 2 - - overview - installation - usage - subdir/index -``` - -Do NOT include `.rst` extension in toctree entries (Sphinx convention — omit the extension). - -#### Bold, Italic, Inline Code - -```rst -**bold text** -*italic text* -``inline code`` -``` - ---- - -### Content Standards - -- **Tone:** Professional but accessible. Not overwhelming, not condescending. -- **Every "How" section** must have at least one working, copy-paste ready code example. -- **Prerequisites** must appear before any step-by-step instructions. -- **Structure:** Follow What → How → Benefits + Real-world examples for every section. -- **Sections stay focused** — avoid walls of text; split into subsections if content exceeds ~60 lines. -- **Cross-references:** Add `:ref:` links to related sections in the guide where relevant. -- **External links:** Use real URLs from the research in `/exasol-new` or `/exasol-modify`. Never invent URLs. -- **Code examples** should use realistic but simple values (e.g., schema name `DEMO`, table `EMPLOYEES`). - ---- - -## Step 3 — Update Toctrees - -### New section folder created: -1. Read `doc/index.rst` -2. Add the new entry to the toctree at the position specified in the plan -3. Write the updated `doc/index.rst` - -### New file added to existing section: -1. Read the section's `index.rst` -2. Add the new filename (without `.rst`) to the toctree in logical order -3. Write the updated `index.rst` - ---- - -## Step 4 — Report - -After all files are written, output a summary: - -``` -Files created: - doc/[section]/index.rst - doc/[section]/overview.rst - ... - -Files modified: - doc/index.rst (added toctree entry: [section]/index) - ... -``` - -If anything in the plan was unclear or could not be fully implemented, note it so the user can follow up. diff --git a/.claude/skills/exasol-modify.md b/.claude/skills/exasol-modify.md deleted file mode 100644 index b84e59c..0000000 --- a/.claude/skills/exasol-modify.md +++ /dev/null @@ -1,114 +0,0 @@ -# Exasol Developer Guide — Modify Section - -Plan modifications to an existing developer guide section. Reads the current content, optionally researches updated information online, then produces a specific modification plan through interactive Q&A. - -## Usage - -``` -/exasol-modify [section name or path] -``` - -Examples: -- `/exasol-modify UDF` -- `/exasol-modify connect_to_exasol` -- `/exasol-modify data_science` - ---- - -## Context - -- **Project path:** `C:\Users\mufa\documents\developer-documentation` -- **Docs root:** `doc/` -- **File format:** reStructuredText (`.rst`) rendered by Sphinx -- **Target audience:** Data professionals and developers — professional but accessible -- **Standard content structure:** What → How (step-by-step with code) → Benefits + Real-world use cases + Examples -- **Gold standard:** `doc/connect_to_exasol/` and `doc/gen_ai/ai_text_summary/` - ---- - -## Step 1 — Locate the Section - -If the user provided a section name or path, resolve it to a folder in `doc/`. If not, ask: -> "Which section do you want to modify?" - -Use Glob to list all files in the section folder, then Read every file. - ---- - -## Step 2 — Assess the Current Content - -Evaluate the section against the developer guide standard: - -**Expected structure:** -1. **What** — Clear definition: what the feature/tool is, why it exists -2. **How** — Step-by-step implementation with working, copy-paste-ready code examples -3. **Benefits + Real-world use cases** — Practical scenarios with concrete examples - -**Check each file for:** -- Missing standard sections (What / How / Benefits) -- Incomplete or non-runnable code examples -- Outdated information (old version numbers, deprecated APIs, broken links) -- Tone issues — too technical/jargon-heavy, too vague, or condescending -- Missing prerequisites before step-by-step instructions -- Missing cross-references to related sections in the guide -- Content that is too dense and needs splitting or simplifying -- Content that is too thin and needs expanding - ---- - -## Step 3 — Research Online (if relevant) - -If the section covers a specific tool, connector, or API, check for updates: -- Search: `site:docs.exasol.com [topic]` -- Search: `site:github.com/exasol [topic]` -- Check for: new versions, changed APIs, new features, deprecated functionality - -Only fetch URLs if you find something likely to contain useful updated information. - ---- - -## Step 4 — Interactive Q&A - -Present your assessment clearly: - -**1. What exists** — Brief summary of current content per file -**2. What's missing** — Gaps against the standard structure -**3. What needs fixing** — Specific issues (be concrete, not vague) -**4. What could be cut** — Content that is redundant, outdated, or out of scope - -Then ask the user: -1. What specifically prompted this modification request? -2. Are there new features, API changes, or corrections to document? -3. Should the file structure stay the same, or should files be split/merged/renamed? -4. Are there new code examples to add? -5. Anything to remove or simplify? -6. Any tone or style issues they've noticed? - -Wait for responses before producing the plan. - ---- - -## Step 5 — Sketch the Modification Plan - -For each file to be changed, state: - -**File path:** -**Current state:** (one-line summary) -**Changes:** -- [ ] Specific addition/removal/edit — be precise (e.g., "Add error handling try/except example after the connect() code block") -- [ ] Another change... - -**New content to add:** (brief description with key points, not full RST) - -**Content to remove:** (quote or describe the part to cut) - -**Structural changes:** (e.g., split into two files, rename, reorder sections) - -If a new file needs to be created as part of the modification, note it and its proposed content outline. - ---- - -## Important - -Do NOT write any files. This skill produces a plan only. -The user will run `/exasol-implement` to apply the changes once the plan is approved. diff --git a/.claude/skills/exasol-new.md b/.claude/skills/exasol-new.md deleted file mode 100644 index f3df49d..0000000 --- a/.claude/skills/exasol-new.md +++ /dev/null @@ -1,131 +0,0 @@ -# Exasol Developer Guide — New Section - -Plan a new developer guide section for an Exasol feature, connector, or tool. Searches online for relevant content and produces a structured plan ready for `/exasol-implement`. - -## Usage - -``` -/exasol-new [feature or topic name] -``` - -Examples: -- `/exasol-new kafka connector` -- `/exasol-new jdbc driver` -- `/exasol-new virtual schemas` - ---- - -## Context - -- **Project path:** `C:\Users\mufa\documents\developer-documentation` -- **Docs root:** `doc/` -- **File format:** reStructuredText (`.rst`) rendered by Sphinx -- **Target audience:** Data professionals and developers — professional but accessible -- **Gold standard examples:** `doc/connect_to_exasol/` (connector) and `doc/gen_ai/ai_text_summary/` (tutorial) -- **Standard content structure:** What → How (step-by-step with code) → Benefits + Real-world use cases + Examples - ---- - -## Step 1 — Identify the Subject - -If the user provided a feature/topic name as an argument, use it. If not, ask: -> "What feature, connector, or tool do you want to document?" - ---- - -## Step 2 — Research Online - -Use WebSearch and WebFetch to gather information from all of the following: - -**Official Exasol sources:** -- Search: `site:docs.exasol.com [topic]` -- Search: `site:github.com/exasol [topic]` -- Fetch the relevant Exasol docs page if found - -**Package registry (if applicable):** -- Search: `site:pypi.org [topic] exasol` -- Fetch the PyPI page if a Python package exists - -**General:** -- Search: `[topic] exasol tutorial getting started` -- Search: `[topic] exasol example` - -From the research, extract: -- What the feature/tool does and why it exists -- Key concepts and terminology -- Official API / configuration parameters -- Code examples and usage patterns -- Prerequisites and system requirements -- Common real-world use cases -- Links to authoritative external documentation - ---- - -## Step 3 — Read the Existing Project - -Read these files to ensure the new section fits the project's conventions: -- `doc/index.rst` — understand the current top-level toctree structure -- `doc/connect_to_exasol/index.rst` and one content file from it -- `doc/gen_ai/ai_text_summary/index.rst` - -Note the RST formatting conventions, heading styles, and toctree patterns used. - ---- - -## Step 4 — Ask Clarifying Questions - -Before sketching the plan, ask: - -1. Is this a **connector**, a **feature**, a **tool**, or a **tutorial/example**? -2. Who is the primary user — data engineers, analysts, data scientists, or all? -3. Are there existing code examples or GitHub repos to reference? -4. Any specific aspects to emphasize — e.g., performance, ease of setup, integrations? -5. Should this be a **top-level section** in `doc/` or a **subsection** of an existing one (e.g., under `examples/` or `data_science/`)? -6. Are there any topics that should be excluded or kept minimal? - -Wait for user responses before sketching the plan. - ---- - -## Step 5 — Sketch the Plan - -Output a concrete plan with the following: - -### Proposed Folder Structure - -``` -doc/[section-folder-name]/ -├── index.rst — Section landing page with toctree -├── overview.rst — What: definition, key concepts, system requirements -├── installation.rst — (if applicable) Setup, dependencies, pip/brew commands -├── [descriptive].rst — How: step-by-step with working code examples -└── [examples].rst — Real-world use cases and complete end-to-end examples -``` - -Adjust the file list based on the complexity and type of content. - -### Per-File Content Plan - -For each file, state: -- **Title** -- **Sections/headings** to include -- **Key content points** (bullet list — not full content) -- **Code examples** to include (language, what the example shows) -- **External links** to reference (from research in Step 2) - -### Toctree Update - -State exactly: -- Which line in `doc/index.rst` to insert the new entry (between which existing entries) -- The exact toctree entry string (e.g., ` [section-folder-name]/index.rst`) - -### Cross-References - -Note any `:ref:` links to or from existing sections that should be added. - ---- - -## Important - -Do NOT write any files. This skill produces a plan only. -The user will run `/exasol-implement` to write the files once the plan is approved. diff --git a/.gitignore b/.gitignore index f90b6ab..ad34b77 100644 --- a/.gitignore +++ b/.gitignore @@ -147,4 +147,8 @@ itde/ # Emacs TAGS + +# AI agent tooling (Claude Code, Serena, gstack) +.claude/ +.serena/ .gstack/ diff --git a/.serena/.gitignore b/.serena/.gitignore deleted file mode 100644 index 2e510af..0000000 --- a/.serena/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/cache -/project.local.yml diff --git a/.serena/project.yml b/.serena/project.yml deleted file mode 100644 index 81ba91e..0000000 --- a/.serena/project.yml +++ /dev/null @@ -1,133 +0,0 @@ -# the name by which the project can be referenced within Serena -project_name: "developer-documentation" - - -# list of languages for which language servers are started; choose from: -# al angular ansible bash clojure -# cpp cpp_ccls crystal csharp csharp_omnisharp -# dart elixir elm erlang fortran -# fsharp go groovy haskell haxe -# hlsl html java json julia -# kotlin lean4 lua luau markdown -# matlab msl nix ocaml pascal -# perl php php_phpactor powershell python -# python_jedi python_ty r rego ruby -# ruby_solargraph rust scala scss solidity -# svelte swift systemverilog terraform toml -# typescript typescript_vts vue yaml zig -# (This list may be outdated. For the current list, see values of Language enum here: -# https://github.com/oraios/serena/blob/main/src/solidlsp/ls_config.py -# For some languages, there are alternative language servers, e.g. csharp_omnisharp, ruby_solargraph.) -# Note: -# - For C, use cpp -# - For JavaScript, use typescript -# - For Angular projects, use angular (subsumes typescript+html; requires `npm install` in the project root) -# - For Svelte projects, use svelte (subsumes typescript/javascript for .svelte projects; requires npm) -# - For SCSS / Sass / plain CSS, use scss (some-sass-language-server handles all three) -# - For Free Pascal/Lazarus, use pascal -# Special requirements: -# Some languages require additional setup/installations. -# See here for details: https://oraios.github.io/serena/01-about/020_programming-languages.html#language-servers -# When using multiple languages, the first language server that supports a given file will be used for that file. -# The first language is the default language and the respective language server will be used as a fallback. -# Note that when using the JetBrains backend, language servers are not used and this list is correspondingly ignored. -languages: -- python - -# the encoding used by text files in the project -# For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings -encoding: "utf-8" - -# line ending convention to use when writing source files. -# Possible values: unset (use global setting), "lf", "crlf", or "native" (platform default) -# This does not affect Serena's own files (e.g. memories and configuration files), which always use native line endings. -line_ending: - -# The language backend to use for this project. -# If not set, the global setting from serena_config.yml is used. -# Valid values: LSP, JetBrains -# Note: the backend is fixed at startup. If a project with a different backend -# is activated post-init, an error will be returned. -language_backend: - -# whether to use project's .gitignore files to ignore files -ignore_all_files_in_gitignore: true - -# advanced configuration option allowing to configure language server-specific options. -# Maps the language key to the options. -# Have a look at the docstring of the constructors of the LS implementations within solidlsp (e.g., for C# or PHP) to see which options are available. -# No documentation on options means no options are available. -ls_specific_settings: {} - -# list of additional workspace folder paths for cross-package reference support (e.g. in monorepos). -# Paths can be absolute or relative to the project root. -# Each folder is registered as an LSP workspace folder, enabling language servers to discover -# symbols and references across package boundaries. -# Currently supported for: TypeScript. -# Example: -# additional_workspace_folders: -# - ../sibling-package -# - ../shared-lib -additional_workspace_folders: [] - -# list of additional paths to ignore in this project. -# Same syntax as gitignore, so you can use * and **. -# Note: global ignored_paths from serena_config.yml are also applied additively. -ignored_paths: [] - -# whether the project is in read-only mode -# If set to true, all editing tools will be disabled and attempts to use them will result in an error -# Added on 2025-04-18 -read_only: false - -# list of tool names to exclude. -# This extends the existing exclusions (e.g. from the global configuration) -# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html -excluded_tools: [] - -# list of tools to include that would otherwise be disabled (particularly optional tools that are disabled by default). -# This extends the existing inclusions (e.g. from the global configuration). -# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html -included_optional_tools: [] - -# fixed set of tools to use as the base tool set (if non-empty), replacing Serena's default set of tools. -# This cannot be combined with non-empty excluded_tools or included_optional_tools. -# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html -fixed_tools: [] - -# list of mode names that are to be activated by default, overriding the setting in the global configuration. -# The full set of modes to be activated is base_modes (from global config) + default_modes + added_modes. -# If the setting is undefined/empty, the default_modes from the global configuration (serena_config.yml) apply. -# Otherwise, this overrides the setting from the global configuration (serena_config.yml). -# Therefore, you can set this to [] if you do not want the default modes defined in the global config to apply -# for this project. -# This setting can, in turn, be overridden by CLI parameters (--mode). -# See https://oraios.github.io/serena/02-usage/050_configuration.html#modes -default_modes: - -# list of mode names to be activated additionally for this project, e.g. ["query-projects"] -# The full set of modes to be activated is base_modes (from global config) + default_modes + added_modes. -# See https://oraios.github.io/serena/02-usage/050_configuration.html#modes -added_modes: - -# initial prompt for the project. It will always be given to the LLM upon activating the project -# (contrary to the memories, which are loaded on demand). -initial_prompt: "" - -# time budget (seconds) per tool call for the retrieval of additional symbol information -# such as docstrings or parameter information. -# This overrides the corresponding setting in the global configuration; see the documentation there. -# If null or missing, use the setting from the global configuration. -symbol_info_budget: - -# list of regex patterns which, when matched, mark a memory entry as read‑only. -# Extends the list from the global configuration, merging the two lists. -read_only_memory_patterns: [] - -# list of regex patterns for memories to completely ignore. -# Matching memories will not appear in list_memories or activate_project output -# and cannot be accessed via read_memory or write_memory. -# To access ignored memory files, use the read_file tool on the raw file path. -# Extends the list from the global configuration, merging the two lists. -# Example: ["_archive/.*", "_episodes/.*"] -ignored_memory_patterns: [] diff --git a/skills/.claude/settings.local.json b/skills/.claude/settings.local.json deleted file mode 100644 index 31d8cde..0000000 --- a/skills/.claude/settings.local.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(git:*)", - "Bash(gh pr:*)", - "WebFetch(domain:raw.githubusercontent.com)", - "Bash(grep -E '\\\\.\\(md|json\\)$')" - ] - } -} From be7149a360c68f5ea5e1571d213c62e76b0ef829 Mon Sep 17 00:00:00 2001 From: Muhammad Abdullah Farooqui Date: Mon, 6 Jul 2026 21:37:03 +0200 Subject: [PATCH 10/11] removed agent files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ad34b77..27e5ee8 100644 --- a/.gitignore +++ b/.gitignore @@ -152,3 +152,4 @@ TAGS .claude/ .serena/ .gstack/ +/skills From 75e7f9817f54291b0b8146888e4ec2c3d9e3ce63 Mon Sep 17 00:00:00 2001 From: Muhammad Abdullah Farooqui Date: Mon, 6 Jul 2026 21:44:39 +0200 Subject: [PATCH 11/11] removed duplicate entry --- doc/index.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/index.rst b/doc/index.rst index b0b8483..047a88c 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -18,7 +18,6 @@ Documentation and resources for data scientists and programmatic users to perfor examples/index.rst environments integrations - exa_statistics/index.rst faq how_edit_this_docu changes/changelog