MindsDB 25.5.3.0__py3-none-any.whl → 25.5.4.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of MindsDB might be problematic. Click here for more details.
- mindsdb/__about__.py +8 -8
- mindsdb/__main__.py +127 -79
- mindsdb/api/a2a/__init__.py +0 -0
- mindsdb/api/a2a/__main__.py +144 -0
- mindsdb/api/a2a/agent.py +308 -0
- mindsdb/api/a2a/common/__init__.py +0 -0
- mindsdb/api/a2a/common/server/__init__.py +4 -0
- mindsdb/api/a2a/common/server/server.py +164 -0
- mindsdb/api/a2a/common/server/task_manager.py +287 -0
- mindsdb/api/a2a/common/server/utils.py +28 -0
- mindsdb/api/a2a/common/types.py +365 -0
- mindsdb/api/a2a/constants.py +9 -0
- mindsdb/api/a2a/run_a2a.py +86 -0
- mindsdb/api/a2a/task_manager.py +560 -0
- mindsdb/api/executor/command_executor.py +185 -309
- mindsdb/api/executor/datahub/classes/response.py +5 -2
- mindsdb/api/executor/datahub/datanodes/integration_datanode.py +39 -72
- mindsdb/api/executor/planner/query_planner.py +10 -1
- mindsdb/api/executor/sql_query/result_set.py +185 -52
- mindsdb/api/executor/sql_query/sql_query.py +1 -1
- mindsdb/api/executor/sql_query/steps/apply_predictor_step.py +9 -12
- mindsdb/api/executor/sql_query/steps/fetch_dataframe.py +8 -10
- mindsdb/api/executor/sql_query/steps/fetch_dataframe_partition.py +5 -44
- mindsdb/api/executor/sql_query/steps/insert_step.py +24 -15
- mindsdb/api/executor/sql_query/steps/join_step.py +1 -1
- mindsdb/api/executor/sql_query/steps/project_step.py +1 -1
- mindsdb/api/executor/sql_query/steps/sql_steps.py +1 -1
- mindsdb/api/executor/sql_query/steps/subselect_step.py +4 -8
- mindsdb/api/executor/sql_query/steps/union_step.py +1 -3
- mindsdb/api/http/initialize.py +99 -83
- mindsdb/api/http/namespaces/analysis.py +3 -3
- mindsdb/api/http/namespaces/config.py +61 -86
- mindsdb/api/http/namespaces/file.py +8 -2
- mindsdb/api/http/namespaces/sql.py +13 -27
- mindsdb/api/mcp/start.py +42 -5
- mindsdb/api/mysql/mysql_proxy/data_types/mysql_packet.py +0 -1
- mindsdb/api/mysql/mysql_proxy/data_types/mysql_packets/binary_resultset_row_package.py +52 -19
- mindsdb/api/mysql/mysql_proxy/executor/mysql_executor.py +8 -10
- mindsdb/api/mysql/mysql_proxy/libs/constants/mysql.py +54 -38
- mindsdb/api/mysql/mysql_proxy/mysql_proxy.py +82 -115
- mindsdb/api/mysql/mysql_proxy/utilities/dump.py +351 -0
- mindsdb/api/postgres/postgres_proxy/executor/executor.py +1 -1
- mindsdb/api/postgres/postgres_proxy/postgres_proxy.py +5 -6
- mindsdb/integrations/handlers/altibase_handler/altibase_handler.py +26 -27
- mindsdb/integrations/handlers/altibase_handler/connection_args.py +13 -13
- mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler.py +8 -8
- mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler_dsn.py +13 -13
- mindsdb/integrations/handlers/anthropic_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/anthropic_handler/anthropic_handler.py +1 -3
- mindsdb/integrations/handlers/aurora_handler/aurora_handler.py +1 -0
- mindsdb/integrations/handlers/autosklearn_handler/autosklearn_handler.py +1 -1
- mindsdb/integrations/handlers/autosklearn_handler/config.py +0 -1
- mindsdb/integrations/handlers/bigquery_handler/bigquery_handler.py +1 -1
- mindsdb/integrations/handlers/bigquery_handler/tests/test_bigquery_handler.py +1 -1
- mindsdb/integrations/handlers/binance_handler/binance_handler.py +1 -0
- mindsdb/integrations/handlers/binance_handler/binance_tables.py +3 -4
- mindsdb/integrations/handlers/byom_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/byom_handler/requirements.txt +1 -2
- mindsdb/integrations/handlers/ckan_handler/ckan_handler.py +3 -0
- mindsdb/integrations/handlers/clickhouse_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/cloud_spanner_handler/tests/test_cloud_spanner_handler.py +0 -2
- mindsdb/integrations/handlers/cloud_sql_handler/cloud_sql_handler.py +0 -1
- mindsdb/integrations/handlers/cohere_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/cohere_handler/cohere_handler.py +11 -13
- mindsdb/integrations/handlers/confluence_handler/confluence_tables.py +6 -0
- mindsdb/integrations/handlers/databend_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/databend_handler/databend_handler.py +4 -4
- mindsdb/integrations/handlers/databend_handler/tests/__init__.py +0 -1
- mindsdb/integrations/handlers/databend_handler/tests/test_databend_handler.py +1 -1
- mindsdb/integrations/handlers/derby_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/derby_handler/derby_handler.py +14 -22
- mindsdb/integrations/handlers/derby_handler/tests/test_derby_handler.py +6 -6
- mindsdb/integrations/handlers/discord_handler/discord_handler.py +5 -5
- mindsdb/integrations/handlers/discord_handler/discord_tables.py +3 -3
- mindsdb/integrations/handlers/discord_handler/tests/test_discord.py +5 -3
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub.py +3 -3
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub_handler.py +2 -2
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub_tables.py +57 -54
- mindsdb/integrations/handlers/dremio_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/druid_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/druid_handler/druid_handler.py +2 -2
- mindsdb/integrations/handlers/edgelessdb_handler/tests/test_edgelessdb_handler.py +9 -9
- mindsdb/integrations/handlers/email_handler/email_client.py +1 -1
- mindsdb/integrations/handlers/email_handler/email_ingestor.py +1 -1
- mindsdb/integrations/handlers/email_handler/email_tables.py +0 -1
- mindsdb/integrations/handlers/email_handler/settings.py +0 -1
- mindsdb/integrations/handlers/eventstoredb_handler/eventstoredb_handler.py +2 -1
- mindsdb/integrations/handlers/firebird_handler/firebird_handler.py +1 -1
- mindsdb/integrations/handlers/flaml_handler/flaml_handler.py +9 -9
- mindsdb/integrations/handlers/frappe_handler/frappe_client.py +5 -5
- mindsdb/integrations/handlers/frappe_handler/frappe_handler.py +6 -5
- mindsdb/integrations/handlers/frappe_handler/frappe_tables.py +2 -2
- mindsdb/integrations/handlers/github_handler/connection_args.py +2 -2
- mindsdb/integrations/handlers/github_handler/github_handler.py +1 -8
- mindsdb/integrations/handlers/github_handler/github_tables.py +13 -24
- mindsdb/integrations/handlers/gitlab_handler/gitlab_handler.py +2 -1
- mindsdb/integrations/handlers/gitlab_handler/gitlab_tables.py +1 -4
- mindsdb/integrations/handlers/gmail_handler/gmail_handler.py +6 -13
- mindsdb/integrations/handlers/google_books_handler/google_books_handler.py +2 -1
- mindsdb/integrations/handlers/google_books_handler/google_books_tables.py +0 -3
- mindsdb/integrations/handlers/google_calendar_handler/google_calendar_handler.py +4 -4
- mindsdb/integrations/handlers/google_calendar_handler/google_calendar_tables.py +2 -6
- mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_handler.py +3 -2
- mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_tables.py +0 -3
- mindsdb/integrations/handlers/google_fit_handler/google_fit_handler.py +10 -12
- mindsdb/integrations/handlers/google_fit_handler/google_fit_tables.py +11 -13
- mindsdb/integrations/handlers/google_search_handler/google_search_handler.py +2 -1
- mindsdb/integrations/handlers/google_search_handler/google_search_tables.py +0 -3
- mindsdb/integrations/handlers/groq_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/hackernews_handler/hn_handler.py +5 -7
- mindsdb/integrations/handlers/hackernews_handler/hn_table.py +6 -7
- mindsdb/integrations/handlers/hive_handler/tests/test_hive_handler.py +1 -1
- mindsdb/integrations/handlers/hsqldb_handler/connection_args.py +6 -6
- mindsdb/integrations/handlers/hsqldb_handler/hsqldb_handler.py +4 -3
- mindsdb/integrations/handlers/huggingface_api_handler/exceptions.py +1 -1
- mindsdb/integrations/handlers/huggingface_api_handler/huggingface_api_handler.py +1 -8
- mindsdb/integrations/handlers/huggingface_handler/huggingface_handler.py +6 -6
- mindsdb/integrations/handlers/huggingface_handler/requirements.txt +1 -1
- mindsdb/integrations/handlers/huggingface_handler/requirements_cpu.txt +1 -1
- mindsdb/integrations/handlers/ignite_handler/ignite_handler.py +2 -1
- mindsdb/integrations/handlers/impala_handler/impala_handler.py +9 -12
- mindsdb/integrations/handlers/impala_handler/tests/test_impala_handler.py +11 -11
- mindsdb/integrations/handlers/influxdb_handler/influxdb_handler.py +10 -13
- mindsdb/integrations/handlers/influxdb_handler/influxdb_tables.py +20 -20
- mindsdb/integrations/handlers/informix_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/informix_handler/__init__.py +12 -5
- mindsdb/integrations/handlers/informix_handler/informix_handler.py +99 -133
- mindsdb/integrations/handlers/informix_handler/tests/test_informix_handler.py +13 -11
- mindsdb/integrations/handlers/ingres_handler/__about__.py +0 -1
- mindsdb/integrations/handlers/ingres_handler/ingres_handler.py +1 -0
- mindsdb/integrations/handlers/jira_handler/jira_handler.py +4 -4
- mindsdb/integrations/handlers/jira_handler/jira_tables.py +9 -9
- mindsdb/integrations/handlers/kinetica_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/lancedb_handler/requirements.txt +0 -1
- mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +4 -4
- mindsdb/integrations/handlers/langchain_handler/tools.py +9 -10
- mindsdb/integrations/handlers/leonardoai_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/lightwood_handler/functions.py +2 -2
- mindsdb/integrations/handlers/lightwood_handler/lightwood_handler.py +0 -1
- mindsdb/integrations/handlers/lightwood_handler/tests/test_lightwood_handler.py +11 -11
- mindsdb/integrations/handlers/litellm_handler/litellm_handler.py +37 -20
- mindsdb/integrations/handlers/llama_index_handler/llama_index_handler.py +4 -4
- mindsdb/integrations/handlers/llama_index_handler/settings.py +10 -9
- mindsdb/integrations/handlers/materialize_handler/tests/test_materialize_handler.py +8 -10
- mindsdb/integrations/handlers/matrixone_handler/matrixone_handler.py +4 -4
- mindsdb/integrations/handlers/matrixone_handler/tests/test_matrixone_handler.py +8 -9
- mindsdb/integrations/handlers/maxdb_handler/connection_args.py +25 -25
- mindsdb/integrations/handlers/maxdb_handler/maxdb_handler.py +1 -0
- mindsdb/integrations/handlers/mediawiki_handler/mediawiki_handler.py +3 -2
- mindsdb/integrations/handlers/mediawiki_handler/mediawiki_tables.py +1 -1
- mindsdb/integrations/handlers/mendeley_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/mendeley_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/mendeley_handler/mendeley_handler.py +48 -56
- mindsdb/integrations/handlers/mendeley_handler/mendeley_tables.py +24 -29
- mindsdb/integrations/handlers/mendeley_handler/tests/test_mendeley_handler.py +19 -17
- mindsdb/integrations/handlers/merlion_handler/merlion_handler.py +5 -4
- mindsdb/integrations/handlers/minds_endpoint_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/mlflow_handler/mlflow_handler.py +58 -36
- mindsdb/integrations/handlers/monetdb_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/monetdb_handler/__init__.py +15 -5
- mindsdb/integrations/handlers/monetdb_handler/connection_args.py +17 -18
- mindsdb/integrations/handlers/monetdb_handler/monetdb_handler.py +40 -57
- mindsdb/integrations/handlers/monetdb_handler/tests/test_monetdb_handler.py +7 -8
- mindsdb/integrations/handlers/monetdb_handler/utils/monet_get_id.py +13 -14
- mindsdb/integrations/handlers/monkeylearn_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/monkeylearn_handler.py +2 -5
- mindsdb/integrations/handlers/ms_one_drive_handler/ms_graph_api_one_drive_client.py +1 -0
- mindsdb/integrations/handlers/ms_one_drive_handler/ms_one_drive_handler.py +1 -1
- mindsdb/integrations/handlers/ms_teams_handler/ms_graph_api_teams_client.py +23 -23
- mindsdb/integrations/handlers/ms_teams_handler/ms_teams_handler.py +3 -3
- mindsdb/integrations/handlers/ms_teams_handler/ms_teams_tables.py +10 -5
- mindsdb/integrations/handlers/mssql_handler/mssql_handler.py +73 -8
- mindsdb/integrations/handlers/mysql_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/mysql_handler/__init__.py +15 -5
- mindsdb/integrations/handlers/mysql_handler/connection_args.py +43 -47
- mindsdb/integrations/handlers/mysql_handler/mysql_handler.py +101 -34
- mindsdb/integrations/handlers/mysql_handler/settings.py +15 -13
- mindsdb/integrations/handlers/neuralforecast_handler/neuralforecast_handler.py +1 -1
- mindsdb/integrations/handlers/newsapi_handler/newsapi_handler.py +1 -1
- mindsdb/integrations/handlers/newsapi_handler/tests/test_newsapi_handler.py +4 -4
- mindsdb/integrations/handlers/nuo_jdbc_handler/connection_args.py +2 -2
- mindsdb/integrations/handlers/nuo_jdbc_handler/nuo_jdbc_handler.py +28 -36
- mindsdb/integrations/handlers/nuo_jdbc_handler/tests/test_nuo_handler.py +5 -5
- mindsdb/integrations/handlers/oceanbase_handler/oceanbase_handler.py +0 -1
- mindsdb/integrations/handlers/oceanbase_handler/tests/test_oceanbase_handler.py +8 -10
- mindsdb/integrations/handlers/ollama_handler/ollama_handler.py +3 -3
- mindsdb/integrations/handlers/opengauss_handler/tests/test_opengauss_handler.py +1 -2
- mindsdb/integrations/handlers/openstreetmap_handler/__init__.py +7 -7
- mindsdb/integrations/handlers/oracle_handler/connection_args.py +6 -0
- mindsdb/integrations/handlers/oracle_handler/oracle_handler.py +77 -11
- mindsdb/integrations/handlers/orioledb_handler/tests/test_orioledb_handler.py +8 -10
- mindsdb/integrations/handlers/palm_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/palm_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/palm_handler/palm_handler.py +1 -3
- mindsdb/integrations/handlers/paypal_handler/paypal_handler.py +2 -2
- mindsdb/integrations/handlers/paypal_handler/paypal_tables.py +15 -14
- mindsdb/integrations/handlers/pgvector_handler/pgvector_handler.py +53 -10
- mindsdb/integrations/handlers/phoenix_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/phoenix_handler/phoenix_handler.py +1 -0
- mindsdb/integrations/handlers/pinot_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/pinot_handler/pinot_handler.py +3 -2
- mindsdb/integrations/handlers/plaid_handler/plaid_handler.py +13 -13
- mindsdb/integrations/handlers/plaid_handler/plaid_tables.py +10 -12
- mindsdb/integrations/handlers/plaid_handler/utils.py +4 -6
- mindsdb/integrations/handlers/planetscale_handler/planetscale_handler.py +1 -4
- mindsdb/integrations/handlers/portkey_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/postgres_handler/postgres_handler.py +105 -24
- mindsdb/integrations/handlers/postgres_handler/tests/test_postgres_handler.py +11 -6
- mindsdb/integrations/handlers/questdb_handler/questdb_handler.py +1 -2
- mindsdb/integrations/handlers/questdb_handler/tests/test_questdb_handler.py +2 -3
- mindsdb/integrations/handlers/quickbooks_handler/quickbooks_handler.py +6 -8
- mindsdb/integrations/handlers/quickbooks_handler/quickbooks_table.py +10 -10
- mindsdb/integrations/handlers/rag_handler/ingest.py +2 -2
- mindsdb/integrations/handlers/rag_handler/rag_handler.py +1 -1
- mindsdb/integrations/handlers/rag_handler/settings.py +1 -1
- mindsdb/integrations/handlers/reddit_handler/reddit_handler.py +2 -7
- mindsdb/integrations/handlers/reddit_handler/reddit_tables.py +2 -3
- mindsdb/integrations/handlers/replicate_handler/replicate_handler.py +6 -6
- mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_handler.py +1 -2
- mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_tables.py +0 -3
- mindsdb/integrations/handlers/rockset_handler/connection_args.py +14 -14
- mindsdb/integrations/handlers/rockset_handler/tests/test_rockset_handler.py +1 -0
- mindsdb/integrations/handlers/scylla_handler/scylla_handler.py +6 -5
- mindsdb/integrations/handlers/sendinblue_handler/sendinblue_handler.py +2 -1
- mindsdb/integrations/handlers/sendinblue_handler/sendinblue_tables.py +16 -16
- mindsdb/integrations/handlers/sentence_transformers_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/sheets_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/shopify_handler/shopify_handler.py +7 -6
- mindsdb/integrations/handlers/shopify_handler/shopify_tables.py +38 -41
- mindsdb/integrations/handlers/singlestore_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/singlestore_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/singlestore_handler/singlestore_handler.py +1 -0
- mindsdb/integrations/handlers/singlestore_handler/tests/test_singlestore_handler.py +3 -3
- mindsdb/integrations/handlers/slack_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/snowflake_handler/snowflake_handler.py +100 -6
- mindsdb/integrations/handlers/solr_handler/connection_args.py +7 -7
- mindsdb/integrations/handlers/solr_handler/solr_handler.py +2 -1
- mindsdb/integrations/handlers/solr_handler/tests/test_solr_handler.py +2 -1
- mindsdb/integrations/handlers/sqlany_handler/sqlany_handler.py +3 -2
- mindsdb/integrations/handlers/sqlite_handler/sqlite_handler.py +1 -0
- mindsdb/integrations/handlers/sqreamdb_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/sqreamdb_handler/sqreamdb_handler.py +15 -20
- mindsdb/integrations/handlers/sqreamdb_handler/tests/test_sqreamdb_handler.py +4 -4
- mindsdb/integrations/handlers/stabilityai_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/starrocks_handler/starrocks_handler.py +0 -1
- mindsdb/integrations/handlers/starrocks_handler/tests/test_starrocks_handler.py +8 -10
- mindsdb/integrations/handlers/statsforecast_handler/statsforecast_handler.py +2 -2
- mindsdb/integrations/handlers/strava_handler/strava_handler.py +4 -8
- mindsdb/integrations/handlers/strava_handler/strava_tables.py +22 -30
- mindsdb/integrations/handlers/stripe_handler/stripe_handler.py +3 -2
- mindsdb/integrations/handlers/stripe_handler/stripe_tables.py +11 -27
- mindsdb/integrations/handlers/supabase_handler/tests/test_supabase_handler.py +1 -1
- mindsdb/integrations/handlers/surrealdb_handler/surrealdb_handler.py +4 -4
- mindsdb/integrations/handlers/tdengine_handler/tdengine_handler.py +25 -27
- mindsdb/integrations/handlers/tdengine_handler/tests/test_tdengine_handler.py +8 -8
- mindsdb/integrations/handlers/tidb_handler/tests/test_tidb_handler.py +1 -2
- mindsdb/integrations/handlers/timegpt_handler/timegpt_handler.py +5 -5
- mindsdb/integrations/handlers/tpot_handler/tpot_handler.py +21 -26
- mindsdb/integrations/handlers/trino_handler/trino_handler.py +14 -14
- mindsdb/integrations/handlers/twitter_handler/twitter_handler.py +2 -4
- mindsdb/integrations/handlers/unify_handler/tests/test_unify_handler.py +7 -8
- mindsdb/integrations/handlers/unify_handler/unify_handler.py +9 -9
- mindsdb/integrations/handlers/vertex_handler/vertex_client.py +1 -1
- mindsdb/integrations/handlers/vertica_handler/tests/test_vertica_handler.py +11 -11
- mindsdb/integrations/handlers/vertica_handler/vertica_handler.py +11 -14
- mindsdb/integrations/handlers/vitess_handler/tests/test_vitess_handler.py +9 -11
- mindsdb/integrations/handlers/vitess_handler/vitess_handler.py +0 -1
- mindsdb/integrations/handlers/web_handler/web_handler.py +1 -0
- mindsdb/integrations/handlers/whatsapp_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/writer_handler/evaluate.py +1 -1
- mindsdb/integrations/handlers/writer_handler/settings.py +0 -1
- mindsdb/integrations/handlers/writer_handler/writer_handler.py +1 -0
- mindsdb/integrations/handlers/youtube_handler/youtube_handler.py +5 -5
- mindsdb/integrations/handlers/youtube_handler/youtube_tables.py +26 -27
- mindsdb/integrations/handlers/yugabyte_handler/tests/test_yugabyte_handler.py +3 -3
- mindsdb/integrations/handlers/yugabyte_handler/yugabyte_handler.py +0 -6
- mindsdb/integrations/libs/llm/config.py +13 -0
- mindsdb/integrations/libs/llm/utils.py +37 -65
- mindsdb/integrations/libs/response.py +67 -52
- mindsdb/integrations/libs/vectordatabase_handler.py +6 -0
- mindsdb/integrations/utilities/handler_utils.py +15 -3
- mindsdb/integrations/utilities/handlers/api_utilities/__init__.py +0 -1
- mindsdb/integrations/utilities/handlers/auth_utilities/__init__.py +0 -2
- mindsdb/integrations/utilities/rag/rerankers/base_reranker.py +230 -227
- mindsdb/integrations/utilities/utils.py +3 -3
- mindsdb/interfaces/agents/agents_controller.py +164 -1
- mindsdb/interfaces/agents/constants.py +32 -13
- mindsdb/interfaces/agents/langchain_agent.py +106 -95
- mindsdb/interfaces/agents/mindsdb_database_agent.py +101 -2
- mindsdb/interfaces/knowledge_base/controller.py +250 -216
- mindsdb/interfaces/knowledge_base/preprocessing/document_preprocessor.py +13 -10
- mindsdb/interfaces/knowledge_base/preprocessing/json_chunker.py +434 -0
- mindsdb/interfaces/knowledge_base/preprocessing/models.py +54 -0
- mindsdb/interfaces/query_context/context_controller.py +66 -10
- mindsdb/interfaces/skills/custom/text2sql/mindsdb_kb_tools.py +190 -0
- mindsdb/interfaces/skills/custom/text2sql/mindsdb_sql_toolkit.py +92 -0
- mindsdb/interfaces/skills/skill_tool.py +202 -57
- mindsdb/interfaces/skills/sql_agent.py +205 -17
- mindsdb/interfaces/storage/fs.py +1 -0
- mindsdb/interfaces/variables/__init__.py +0 -0
- mindsdb/interfaces/variables/variables_controller.py +97 -0
- mindsdb/migrations/env.py +5 -7
- mindsdb/migrations/migrate.py +47 -7
- mindsdb/migrations/versions/2025-05-21_9f150e4f9a05_checkpoint_1.py +360 -0
- mindsdb/utilities/config.py +287 -216
- mindsdb/utilities/starters.py +13 -0
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/METADATA +646 -698
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/RECORD +312 -295
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/WHEEL +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/requirements.txt +0 -1
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/licenses/LICENSE +0 -0
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/top_level.txt +0 -0
|
@@ -10,16 +10,17 @@ from mindsdb.integrations.libs.base import DatabaseHandler
|
|
|
10
10
|
from mindsdb.integrations.libs.response import (
|
|
11
11
|
HandlerStatusResponse as StatusResponse,
|
|
12
12
|
HandlerResponse as Response,
|
|
13
|
-
RESPONSE_TYPE
|
|
13
|
+
RESPONSE_TYPE,
|
|
14
14
|
)
|
|
15
15
|
from mindsdb.integrations.handlers.mysql_handler.settings import ConnectionConfig
|
|
16
16
|
from mindsdb.api.mysql.mysql_proxy.libs.constants.mysql import MYSQL_DATA_TYPE
|
|
17
|
+
from mindsdb.api.mysql.mysql_proxy.libs.constants.mysql import C_TYPES, DATA_C_TYPE_MAP
|
|
17
18
|
|
|
18
19
|
logger = log.getLogger(__name__)
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
def _map_type(mysql_type_text: str) -> MYSQL_DATA_TYPE:
|
|
22
|
-
"""
|
|
23
|
+
"""Map MySQL text types names to MySQL types as enum.
|
|
23
24
|
|
|
24
25
|
Args:
|
|
25
26
|
mysql_type_text (str): The name of the MySQL type to map.
|
|
@@ -30,23 +31,95 @@ def _map_type(mysql_type_text: str) -> MYSQL_DATA_TYPE:
|
|
|
30
31
|
try:
|
|
31
32
|
return MYSQL_DATA_TYPE(mysql_type_text.upper())
|
|
32
33
|
except Exception:
|
|
33
|
-
logger.warning(
|
|
34
|
+
logger.warning(
|
|
35
|
+
f"MySQL handler: unknown type: {mysql_type_text}, use TEXT as fallback."
|
|
36
|
+
)
|
|
34
37
|
return MYSQL_DATA_TYPE.TEXT
|
|
35
38
|
|
|
36
39
|
|
|
40
|
+
def _make_table_response(result: list[dict], cursor: mysql.connector.cursor.MySQLCursor) -> Response:
|
|
41
|
+
"""Build response from result and cursor.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
result (list[dict]): result of the query.
|
|
45
|
+
cursor (mysql.connector.cursor.MySQLCursor): cursor object.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
Response: response object.
|
|
49
|
+
"""
|
|
50
|
+
description = cursor.description
|
|
51
|
+
reverse_c_type_map = {v.code: k for k, v in DATA_C_TYPE_MAP.items() if v.code != C_TYPES.MYSQL_TYPE_BLOB}
|
|
52
|
+
mysql_types: list[MYSQL_DATA_TYPE] = []
|
|
53
|
+
for col in description:
|
|
54
|
+
type_int = col[1]
|
|
55
|
+
if isinstance(type_int, int) is False:
|
|
56
|
+
mysql_types.append(MYSQL_DATA_TYPE.TEXT)
|
|
57
|
+
continue
|
|
58
|
+
|
|
59
|
+
if type_int == C_TYPES.MYSQL_TYPE_TINY:
|
|
60
|
+
# There are 3 types that returns as TINYINT: TINYINT, BOOL, BOOLEAN.
|
|
61
|
+
mysql_types.append(MYSQL_DATA_TYPE.TINYINT)
|
|
62
|
+
continue
|
|
63
|
+
|
|
64
|
+
if type_int in reverse_c_type_map:
|
|
65
|
+
mysql_types.append(reverse_c_type_map[type_int])
|
|
66
|
+
continue
|
|
67
|
+
|
|
68
|
+
if type_int != C_TYPES.MYSQL_TYPE_BLOB:
|
|
69
|
+
raise ValueError(f'Unknown MySQL type id={type_int} in column {col[0]}')
|
|
70
|
+
|
|
71
|
+
# region determine text/blob type by flags
|
|
72
|
+
# Unfortunately, there is no way to determine particular type of text/blob column by flags.
|
|
73
|
+
# Subtype have to be determined by 8-s element of description tuple, but mysql.conector
|
|
74
|
+
# return the same value for all text types (TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT), and for
|
|
75
|
+
# all blob types (TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB).
|
|
76
|
+
if col[7] == 16: # and col[8] == 45
|
|
77
|
+
mysql_types.append(MYSQL_DATA_TYPE.TEXT)
|
|
78
|
+
elif col[7] == 144: # and col[8] == 63
|
|
79
|
+
mysql_types.append(MYSQL_DATA_TYPE.BLOB)
|
|
80
|
+
else:
|
|
81
|
+
logger.debug(f'MySQL handler: unknown type code {col[7]}, use TEXT as fallback.')
|
|
82
|
+
mysql_types.append(MYSQL_DATA_TYPE.TEXT)
|
|
83
|
+
# endregion
|
|
84
|
+
|
|
85
|
+
# region cast int and bool to nullable types
|
|
86
|
+
serieses = []
|
|
87
|
+
for i, mysql_type in enumerate(mysql_types):
|
|
88
|
+
expected_dtype = None
|
|
89
|
+
column_name = description[i][0]
|
|
90
|
+
if mysql_type in (
|
|
91
|
+
MYSQL_DATA_TYPE.SMALLINT, MYSQL_DATA_TYPE.INT, MYSQL_DATA_TYPE.MEDIUMINT,
|
|
92
|
+
MYSQL_DATA_TYPE.BIGINT, MYSQL_DATA_TYPE.TINYINT
|
|
93
|
+
):
|
|
94
|
+
expected_dtype = 'Int64'
|
|
95
|
+
elif mysql_type in (MYSQL_DATA_TYPE.BOOL, MYSQL_DATA_TYPE.BOOLEAN):
|
|
96
|
+
expected_dtype = 'boolean'
|
|
97
|
+
serieses.append(pd.Series([row[column_name] for row in result], dtype=expected_dtype, name=description[i][0]))
|
|
98
|
+
df = pd.concat(serieses, axis=1, copy=False)
|
|
99
|
+
# endregion
|
|
100
|
+
|
|
101
|
+
response = Response(
|
|
102
|
+
RESPONSE_TYPE.TABLE,
|
|
103
|
+
df,
|
|
104
|
+
affected_rows=cursor.rowcount,
|
|
105
|
+
mysql_types=mysql_types
|
|
106
|
+
)
|
|
107
|
+
return response
|
|
108
|
+
|
|
109
|
+
|
|
37
110
|
class MySQLHandler(DatabaseHandler):
|
|
38
111
|
"""
|
|
39
112
|
This handler handles connection and execution of the MySQL statements.
|
|
40
113
|
"""
|
|
41
114
|
|
|
42
|
-
name =
|
|
115
|
+
name = "mysql"
|
|
43
116
|
|
|
44
117
|
def __init__(self, name, **kwargs):
|
|
45
118
|
super().__init__(name)
|
|
46
119
|
self.parser = parse_sql
|
|
47
|
-
self.dialect =
|
|
48
|
-
self.connection_data = kwargs.get(
|
|
49
|
-
self.database = self.connection_data.get(
|
|
120
|
+
self.dialect = "mysql"
|
|
121
|
+
self.connection_data = kwargs.get("connection_data", {})
|
|
122
|
+
self.database = self.connection_data.get("database")
|
|
50
123
|
|
|
51
124
|
self.connection = None
|
|
52
125
|
|
|
@@ -91,28 +164,28 @@ class MySQLHandler(DatabaseHandler):
|
|
|
91
164
|
if self.is_connected and self.connection.is_connected():
|
|
92
165
|
return self.connection
|
|
93
166
|
config = self._unpack_config()
|
|
94
|
-
if
|
|
95
|
-
config[
|
|
167
|
+
if "conn_attrs" in self.connection_data:
|
|
168
|
+
config["conn_attrs"] = self.connection_data["conn_attrs"]
|
|
96
169
|
|
|
97
|
-
if
|
|
98
|
-
config[
|
|
170
|
+
if "connection_timeout" not in config:
|
|
171
|
+
config["connection_timeout"] = 10
|
|
99
172
|
|
|
100
|
-
ssl = self.connection_data.get(
|
|
173
|
+
ssl = self.connection_data.get("ssl")
|
|
101
174
|
if ssl is True:
|
|
102
|
-
ssl_ca = self.connection_data.get(
|
|
103
|
-
ssl_cert = self.connection_data.get(
|
|
104
|
-
ssl_key = self.connection_data.get(
|
|
105
|
-
config[
|
|
175
|
+
ssl_ca = self.connection_data.get("ssl_ca")
|
|
176
|
+
ssl_cert = self.connection_data.get("ssl_cert")
|
|
177
|
+
ssl_key = self.connection_data.get("ssl_key")
|
|
178
|
+
config["client_flags"] = [mysql.connector.constants.ClientFlag.SSL]
|
|
106
179
|
if ssl_ca is not None:
|
|
107
180
|
config["ssl_ca"] = ssl_ca
|
|
108
181
|
if ssl_cert is not None:
|
|
109
182
|
config["ssl_cert"] = ssl_cert
|
|
110
183
|
if ssl_key is not None:
|
|
111
184
|
config["ssl_key"] = ssl_key
|
|
112
|
-
if
|
|
113
|
-
config[
|
|
114
|
-
if
|
|
115
|
-
config[
|
|
185
|
+
if "collation" not in config:
|
|
186
|
+
config["collation"] = "utf8mb4_general_ci"
|
|
187
|
+
if "use_pure" not in config:
|
|
188
|
+
config["use_pure"] = True
|
|
116
189
|
try:
|
|
117
190
|
connection = mysql.connector.connect(**config)
|
|
118
191
|
connection.autocommit = True
|
|
@@ -146,7 +219,9 @@ class MySQLHandler(DatabaseHandler):
|
|
|
146
219
|
connection = self.connect()
|
|
147
220
|
result.success = connection.is_connected()
|
|
148
221
|
except mysql.connector.Error as e:
|
|
149
|
-
logger.error(
|
|
222
|
+
logger.error(
|
|
223
|
+
f'Error connecting to MySQL {self.connection_data["database"]}, {e}!'
|
|
224
|
+
)
|
|
150
225
|
result.error_message = str(e)
|
|
151
226
|
|
|
152
227
|
if result.success and need_to_close:
|
|
@@ -173,22 +248,14 @@ class MySQLHandler(DatabaseHandler):
|
|
|
173
248
|
cur.execute(query)
|
|
174
249
|
if cur.with_rows:
|
|
175
250
|
result = cur.fetchall()
|
|
176
|
-
response =
|
|
177
|
-
RESPONSE_TYPE.TABLE,
|
|
178
|
-
pd.DataFrame(
|
|
179
|
-
result,
|
|
180
|
-
columns=[x[0] for x in cur.description]
|
|
181
|
-
),
|
|
182
|
-
affected_rows=cur.rowcount
|
|
183
|
-
)
|
|
251
|
+
response = _make_table_response(result, cur)
|
|
184
252
|
else:
|
|
185
253
|
response = Response(RESPONSE_TYPE.OK, affected_rows=cur.rowcount)
|
|
186
254
|
except mysql.connector.Error as e:
|
|
187
|
-
logger.error(
|
|
188
|
-
|
|
189
|
-
RESPONSE_TYPE.ERROR,
|
|
190
|
-
error_message=str(e)
|
|
255
|
+
logger.error(
|
|
256
|
+
f'Error running query: {query} on {self.connection_data["database"]}!'
|
|
191
257
|
)
|
|
258
|
+
response = Response(RESPONSE_TYPE.ERROR, error_message=str(e))
|
|
192
259
|
if connection is not None and connection.is_connected():
|
|
193
260
|
connection.rollback()
|
|
194
261
|
|
|
@@ -201,7 +268,7 @@ class MySQLHandler(DatabaseHandler):
|
|
|
201
268
|
"""
|
|
202
269
|
Retrieve the data from the SQL statement.
|
|
203
270
|
"""
|
|
204
|
-
renderer = SqlalchemyRender(
|
|
271
|
+
renderer = SqlalchemyRender("mysql")
|
|
205
272
|
query_str = renderer.get_string(query, with_failback=True)
|
|
206
273
|
return self.native_query(query_str)
|
|
207
274
|
|
|
@@ -14,29 +14,31 @@ class ConnectionConfig(BaseModel):
|
|
|
14
14
|
@model_validator(mode="before")
|
|
15
15
|
def check_db_params(cls, values):
|
|
16
16
|
"""Ensures either URL is provided or all individual parameters are provided."""
|
|
17
|
-
url = values.get(
|
|
18
|
-
host = values.get(
|
|
19
|
-
user = values.get(
|
|
20
|
-
password = values.get(
|
|
21
|
-
database = values.get(
|
|
17
|
+
url = values.get("url")
|
|
18
|
+
host = values.get("host")
|
|
19
|
+
user = values.get("user")
|
|
20
|
+
password = values.get("password")
|
|
21
|
+
database = values.get("database")
|
|
22
22
|
if not url and not (host and user and password and database):
|
|
23
|
-
raise ValueError(
|
|
23
|
+
raise ValueError(
|
|
24
|
+
"Either a valid URL or required parameters (host, user, password, database) must be provided."
|
|
25
|
+
)
|
|
24
26
|
|
|
25
27
|
if url:
|
|
26
28
|
parsed = urlparse(url)
|
|
27
|
-
values[
|
|
28
|
-
values[
|
|
29
|
-
values[
|
|
30
|
-
values[
|
|
31
|
-
values[
|
|
29
|
+
values["host"] = parsed.hostname or host
|
|
30
|
+
values["port"] = parsed.port if parsed.port is not None else 3306
|
|
31
|
+
values["user"] = parsed.username or user
|
|
32
|
+
values["password"] = parsed.password or password
|
|
33
|
+
values["database"] = parsed.path[1:] if parsed.path else database
|
|
32
34
|
|
|
33
35
|
# mysql connector raise error if url is provided
|
|
34
|
-
values.pop(
|
|
36
|
+
values.pop("url", None)
|
|
35
37
|
|
|
36
38
|
return values
|
|
37
39
|
|
|
38
40
|
if not url:
|
|
39
|
-
for param in [
|
|
41
|
+
for param in ["host", "user", "password", "database"]:
|
|
40
42
|
if not values.get(param):
|
|
41
43
|
raise ValueError(f"{param} is required when URL is not provided.")
|
|
42
44
|
return values
|
|
@@ -41,7 +41,7 @@ class NeuralForecastHandler(BaseMLEngine):
|
|
|
41
41
|
time_settings = args["timeseries_settings"]
|
|
42
42
|
using_args = args["using"]
|
|
43
43
|
assert time_settings["is_timeseries"], "Specify time series settings in your query"
|
|
44
|
-
|
|
44
|
+
# store model args and time series settings in the model folder
|
|
45
45
|
model_args = {}
|
|
46
46
|
model_args["target"] = target
|
|
47
47
|
model_args["horizon"] = time_settings["horizon"]
|
|
@@ -194,7 +194,7 @@ class NewsAPIHandler(APIHandler):
|
|
|
194
194
|
try:
|
|
195
195
|
result = self.api.get_everything(**params)
|
|
196
196
|
except Exception as e:
|
|
197
|
-
raise RuntimeError(f"API call failed: {e}")
|
|
197
|
+
raise RuntimeError(f"API call failed: {e}")
|
|
198
198
|
articles = result["articles"]
|
|
199
199
|
for article in articles:
|
|
200
200
|
article["source_id"] = article["source"]["id"]
|
|
@@ -28,12 +28,12 @@ class NewsApiHandlerTest(unittest.TestCase):
|
|
|
28
28
|
def test_3_select(self):
|
|
29
29
|
# table = self.handler.get_table("article")
|
|
30
30
|
with self.assertRaises(NewsAPIException):
|
|
31
|
-
|
|
31
|
+
self.handler.native_query("SELECT * FROM article")
|
|
32
32
|
|
|
33
33
|
def test_4_select(self):
|
|
34
34
|
# table = self.handler.get_table("article")
|
|
35
35
|
with self.assertRaises(NewsAPIException):
|
|
36
|
-
|
|
36
|
+
self.handler.native_query(
|
|
37
37
|
'SELECT * FROM article WHERE query="google" AND sources="google.com"'
|
|
38
38
|
)
|
|
39
39
|
|
|
@@ -46,7 +46,7 @@ class NewsApiHandlerTest(unittest.TestCase):
|
|
|
46
46
|
|
|
47
47
|
def test_6_select(self):
|
|
48
48
|
# table = self.handler.get_table("article")
|
|
49
|
-
|
|
49
|
+
self.handler.native_query(
|
|
50
50
|
'SELECT * FROM article WHERE query="google" AND publishedAt >= "2023-03-23" AND publishedAt <= "2023-04-23"'
|
|
51
51
|
)
|
|
52
52
|
|
|
@@ -74,7 +74,7 @@ class NewsApiHandlerTest(unittest.TestCase):
|
|
|
74
74
|
def test_10_select(self):
|
|
75
75
|
# table = self.handler.get_table("article")
|
|
76
76
|
with self.assertRaises(NotImplementedError):
|
|
77
|
-
|
|
77
|
+
self.handler.native_query(
|
|
78
78
|
'SELECT * FROM article WHERE query="google" ORDER BY query'
|
|
79
79
|
)
|
|
80
80
|
|
|
@@ -44,8 +44,8 @@ connection_args = OrderedDict(
|
|
|
44
44
|
driver_args={
|
|
45
45
|
'type': ARG_TYPE.STR,
|
|
46
46
|
'description': """
|
|
47
|
-
The extra arguments which can be specified to the driver.
|
|
48
|
-
Specify this in the format: "arg1=value1,arg2=value2.
|
|
47
|
+
The extra arguments which can be specified to the driver.
|
|
48
|
+
Specify this in the format: "arg1=value1,arg2=value2.
|
|
49
49
|
More information on the supported paramters can be found at: https://doc.nuodb.com/nuodb/latest/deployment-models/physical-or-vmware-environments-with-nuodb-admin/reference-information/connection-properties/'
|
|
50
50
|
"""
|
|
51
51
|
}
|
|
@@ -13,11 +13,10 @@ import jaydebeapi as jdbcconnector
|
|
|
13
13
|
|
|
14
14
|
logger = log.getLogger(__name__)
|
|
15
15
|
|
|
16
|
-
class NuoHandler(DatabaseHandler):
|
|
17
|
-
|
|
18
16
|
|
|
19
|
-
|
|
17
|
+
class NuoHandler(DatabaseHandler):
|
|
20
18
|
|
|
19
|
+
name = 'nuo_jdbc'
|
|
21
20
|
|
|
22
21
|
def __init__(self, name: str, connection_data: Optional[dict], **kwargs):
|
|
23
22
|
""" Initialize the handler
|
|
@@ -27,7 +26,7 @@ class NuoHandler(DatabaseHandler):
|
|
|
27
26
|
**kwargs: arbitrary keyword arguments.
|
|
28
27
|
"""
|
|
29
28
|
super().__init__(name)
|
|
30
|
-
|
|
29
|
+
|
|
31
30
|
self.kwargs = kwargs
|
|
32
31
|
self.parser = parse_sql
|
|
33
32
|
self.database = connection_data['database']
|
|
@@ -42,7 +41,7 @@ class NuoHandler(DatabaseHandler):
|
|
|
42
41
|
self.schema = None
|
|
43
42
|
|
|
44
43
|
self.jdbc_url = self.construct_jdbc_url()
|
|
45
|
-
|
|
44
|
+
|
|
46
45
|
def connect(self):
|
|
47
46
|
""" Set up any connections required by the handler
|
|
48
47
|
Should return output of check_connection() method after attempting
|
|
@@ -56,10 +55,10 @@ class NuoHandler(DatabaseHandler):
|
|
|
56
55
|
jdbc_class = "com.nuodb.jdbc.Driver"
|
|
57
56
|
jar_location = self.connection_config.get('jar_location')
|
|
58
57
|
|
|
59
|
-
try:
|
|
60
|
-
if(jar_location):
|
|
58
|
+
try:
|
|
59
|
+
if (jar_location):
|
|
61
60
|
self.connection = jdbcconnector.connect(jclassname=jdbc_class, url=self.jdbc_url, jars=jar_location)
|
|
62
|
-
else:
|
|
61
|
+
else:
|
|
63
62
|
self.connection = jdbcconnector.connect(jclassname=jdbc_class, url=self.jdbc_url)
|
|
64
63
|
except Exception as e:
|
|
65
64
|
logger.error(f"Error while connecting to {self.database}, {e}")
|
|
@@ -68,40 +67,38 @@ class NuoHandler(DatabaseHandler):
|
|
|
68
67
|
|
|
69
68
|
def construct_jdbc_url(self):
|
|
70
69
|
""" Constructs the JDBC url based on the paramters provided to the handler class.\
|
|
71
|
-
Returns:
|
|
72
|
-
The JDBC connection url string.
|
|
70
|
+
Returns:
|
|
71
|
+
The JDBC connection url string.
|
|
73
72
|
"""
|
|
74
73
|
|
|
75
74
|
jdbc_url = "jdbc:com.nuodb://" + self.host
|
|
76
75
|
|
|
77
|
-
#port is an optional paramter, if found then append
|
|
76
|
+
# port is an optional paramter, if found then append
|
|
78
77
|
port = self.connection_config.get('port')
|
|
79
|
-
if port:
|
|
78
|
+
if port:
|
|
80
79
|
jdbc_url = jdbc_url + ":" + str(port)
|
|
81
|
-
|
|
82
|
-
jdbc_url = jdbc_url + "/" + self.database + "?user=" + self.user + "&password=" + self.password
|
|
83
80
|
|
|
84
|
-
|
|
81
|
+
jdbc_url = jdbc_url + "/" + self.database + "?user=" + self.user + "&password=" + self.password
|
|
82
|
+
|
|
83
|
+
# check if a schema is provided in the connection args, if provided use the schema to establish connection
|
|
85
84
|
schema = self.connection_config.get('schema')
|
|
86
|
-
if schema:
|
|
85
|
+
if schema:
|
|
87
86
|
self.schema = schema
|
|
88
87
|
jdbc_url = jdbc_url + "&schema=" + schema
|
|
89
88
|
|
|
90
|
-
#sets direct paramter only if the paramters is specified to be true
|
|
91
|
-
if(str(self.is_direct).lower() == 'true'):
|
|
89
|
+
# sets direct paramter only if the paramters is specified to be true
|
|
90
|
+
if (str(self.is_direct).lower() == 'true'):
|
|
92
91
|
jdbc_url = jdbc_url + "&direct=true"
|
|
93
92
|
|
|
94
|
-
|
|
95
93
|
driver_args = self.connection_config.get('driver_args')
|
|
96
94
|
|
|
97
|
-
#if driver args are present then construct them in the form: &query=one#qquerytwo=true
|
|
98
|
-
#finally append these to the url
|
|
99
|
-
if(driver_args):
|
|
95
|
+
# if driver args are present then construct them in the form: &query=one#qquerytwo=true
|
|
96
|
+
# finally append these to the url
|
|
97
|
+
if (driver_args):
|
|
100
98
|
driver_arg_string = '&'.join(driver_args.split(","))
|
|
101
|
-
jdbc_url = jdbc_url + "&" + driver_arg_string
|
|
99
|
+
jdbc_url = jdbc_url + "&" + driver_arg_string
|
|
102
100
|
|
|
103
|
-
return jdbc_url
|
|
104
|
-
|
|
101
|
+
return jdbc_url
|
|
105
102
|
|
|
106
103
|
def disconnect(self):
|
|
107
104
|
""" Close any existing connections
|
|
@@ -111,12 +108,11 @@ class NuoHandler(DatabaseHandler):
|
|
|
111
108
|
return
|
|
112
109
|
try:
|
|
113
110
|
self.connection.close()
|
|
114
|
-
self.is_connected=False
|
|
111
|
+
self.is_connected = False
|
|
115
112
|
except Exception as e:
|
|
116
113
|
logger.error(f"Error while disconnecting to {self.database}, {e}")
|
|
117
114
|
|
|
118
|
-
return
|
|
119
|
-
|
|
115
|
+
return
|
|
120
116
|
|
|
121
117
|
def check_connection(self) -> StatusResponse:
|
|
122
118
|
""" Check connection to the handler
|
|
@@ -140,7 +136,6 @@ class NuoHandler(DatabaseHandler):
|
|
|
140
136
|
|
|
141
137
|
return responseCode
|
|
142
138
|
|
|
143
|
-
|
|
144
139
|
def native_query(self, query: str) -> StatusResponse:
|
|
145
140
|
"""Receive raw query and act upon it somehow.
|
|
146
141
|
Args:
|
|
@@ -155,7 +150,7 @@ class NuoHandler(DatabaseHandler):
|
|
|
155
150
|
try:
|
|
156
151
|
cur.execute(query)
|
|
157
152
|
if cur.description:
|
|
158
|
-
result = cur.fetchall()
|
|
153
|
+
result = cur.fetchall()
|
|
159
154
|
response = Response(
|
|
160
155
|
RESPONSE_TYPE.TABLE,
|
|
161
156
|
data_frame=pd.DataFrame(
|
|
@@ -179,7 +174,6 @@ class NuoHandler(DatabaseHandler):
|
|
|
179
174
|
|
|
180
175
|
return response
|
|
181
176
|
|
|
182
|
-
|
|
183
177
|
def query(self, query: ASTNode) -> StatusResponse:
|
|
184
178
|
"""Render and execute a SQL query.
|
|
185
179
|
|
|
@@ -196,24 +190,22 @@ class NuoHandler(DatabaseHandler):
|
|
|
196
190
|
|
|
197
191
|
return self.native_query(query_str)
|
|
198
192
|
|
|
199
|
-
|
|
200
193
|
def get_tables(self) -> StatusResponse:
|
|
201
194
|
"""Get a list of all the tables in the database.
|
|
202
195
|
|
|
203
196
|
Returns:
|
|
204
197
|
Response: Names of the tables in the database.
|
|
205
198
|
"""
|
|
206
|
-
if self.schema:
|
|
199
|
+
if self.schema:
|
|
207
200
|
query = f''' SELECT TABLENAME FROM SYSTEM.TABLES WHERE SCHEMA = '{self.schema}' '''
|
|
208
|
-
else:
|
|
201
|
+
else:
|
|
209
202
|
query = ''' SELECT TABLENAME FROM SYSTEM.TABLES WHERE SCHEMA != 'SYSTEM' '''
|
|
210
|
-
|
|
203
|
+
|
|
211
204
|
result = self.native_query(query)
|
|
212
205
|
df = result.data_frame
|
|
213
206
|
result.data_frame = df.rename(columns={df.columns[0]: 'table_name'})
|
|
214
207
|
return result
|
|
215
208
|
|
|
216
|
-
|
|
217
209
|
def get_columns(self, table_name: str) -> StatusResponse:
|
|
218
210
|
"""Get details about a table.
|
|
219
211
|
|
|
@@ -2,6 +2,7 @@ import unittest
|
|
|
2
2
|
from mindsdb.integrations.handlers.nuo_jdbc_handler.nuo_jdbc_handler import NuoHandler
|
|
3
3
|
from mindsdb.api.executor.data_types.response_type import RESPONSE_TYPE
|
|
4
4
|
|
|
5
|
+
|
|
5
6
|
class NuoHandlerTest(unittest.TestCase):
|
|
6
7
|
@classmethod
|
|
7
8
|
def setUpClass(cls):
|
|
@@ -20,7 +21,7 @@ class NuoHandlerTest(unittest.TestCase):
|
|
|
20
21
|
|
|
21
22
|
def test_0_connect(self):
|
|
22
23
|
self.handler.connect()
|
|
23
|
-
|
|
24
|
+
|
|
24
25
|
def test_1_check_connection(self):
|
|
25
26
|
self.handler.check_connection()
|
|
26
27
|
|
|
@@ -35,7 +36,7 @@ class NuoHandlerTest(unittest.TestCase):
|
|
|
35
36
|
def test_4_select(self):
|
|
36
37
|
res = self.handler.query('SELECT * FROM HOCKEY')
|
|
37
38
|
assert res.type is RESPONSE_TYPE.TABLE
|
|
38
|
-
|
|
39
|
+
|
|
39
40
|
def test_5_get_tables(self):
|
|
40
41
|
res = self.handler.get_tables()
|
|
41
42
|
assert res.type is RESPONSE_TYPE.TABLE
|
|
@@ -43,8 +44,7 @@ class NuoHandlerTest(unittest.TestCase):
|
|
|
43
44
|
def test_6_get_columns(self):
|
|
44
45
|
res = self.handler.get_columns("HOCKEY")
|
|
45
46
|
assert res.type is RESPONSE_TYPE.TABLE
|
|
46
|
-
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
|
|
49
49
|
if __name__ == '__main__':
|
|
50
|
-
unittest.main()
|
|
50
|
+
unittest.main()
|
|
@@ -2,6 +2,7 @@ import unittest
|
|
|
2
2
|
from mindsdb.integrations.handlers.oceanbase_handler.oceanbase_handler import OceanBaseHandler
|
|
3
3
|
from mindsdb.integrations.libs.response import RESPONSE_TYPE
|
|
4
4
|
|
|
5
|
+
|
|
5
6
|
class OceanBaseHandlerTest(unittest.TestCase):
|
|
6
7
|
@classmethod
|
|
7
8
|
def setUpClass(cls):
|
|
@@ -21,36 +22,33 @@ class OceanBaseHandlerTest(unittest.TestCase):
|
|
|
21
22
|
|
|
22
23
|
def test_1_connect(self):
|
|
23
24
|
assert self.handler.connect()
|
|
24
|
-
|
|
25
|
+
|
|
25
26
|
def test_2_create_table(self):
|
|
26
27
|
query = "CREATE Table IF NOT EXISTS Lover(name varchar(101));"
|
|
27
28
|
result = self.handler.query(query)
|
|
28
|
-
assert result.type is not RESPONSE_TYPE.ERROR
|
|
29
|
+
assert result.type is not RESPONSE_TYPE.ERROR
|
|
29
30
|
|
|
30
31
|
def test_3_insert(self):
|
|
31
32
|
query = "INSERT INTO LOVER VALUES('Shiv Shakti');"
|
|
32
33
|
result = self.handler.query(query)
|
|
33
|
-
assert result.type is not RESPONSE_TYPE.ERROR
|
|
34
|
+
assert result.type is not RESPONSE_TYPE.ERROR
|
|
34
35
|
|
|
35
36
|
def test_4_native_query_select(self):
|
|
36
37
|
query = "SELECT * FROM LOVER;"
|
|
37
38
|
result = self.handler.query(query)
|
|
38
|
-
assert result.type is RESPONSE_TYPE.TABLE
|
|
39
|
+
assert result.type is RESPONSE_TYPE.TABLE
|
|
39
40
|
|
|
40
41
|
def test_5_get_tables(self):
|
|
41
42
|
tables = self.handler.get_tables()
|
|
42
|
-
assert tables.type is
|
|
43
|
+
assert tables.type is RESPONSE_TYPE.TABLE
|
|
43
44
|
|
|
44
45
|
def test_6_get_columns(self):
|
|
45
46
|
columns = self.handler.get_columns('LOVER')
|
|
46
|
-
|
|
47
|
+
|
|
47
48
|
query = "DROP Table IF EXISTS Lover;"
|
|
48
|
-
|
|
49
|
+
self.handler.query(query)
|
|
49
50
|
assert columns.type is not RESPONSE_TYPE.ERROR
|
|
50
51
|
|
|
51
52
|
|
|
52
53
|
if __name__ == '__main__':
|
|
53
54
|
unittest.main()
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
@@ -63,7 +63,7 @@ class OllamaHandler(BaseMLEngine):
|
|
|
63
63
|
responses = _model_check()
|
|
64
64
|
if 200 not in responses.values():
|
|
65
65
|
raise Exception(f"Ollama model `{args['model_name']}` is not working correctly. Please try pulling this model manually, check it works correctly and try again.") # noqa
|
|
66
|
-
|
|
66
|
+
|
|
67
67
|
supported_modes = {k: True if v == 200 else False for k, v in responses.items()}
|
|
68
68
|
|
|
69
69
|
# check if a mode has been provided and if it is valid
|
|
@@ -71,7 +71,7 @@ class OllamaHandler(BaseMLEngine):
|
|
|
71
71
|
if 'mode' in args:
|
|
72
72
|
if args['mode'] not in runnable_modes:
|
|
73
73
|
raise Exception(f"Mode `{args['mode']}` is not supported by the model `{args['model_name']}`.")
|
|
74
|
-
|
|
74
|
+
|
|
75
75
|
# if a mode has not been provided, check if the model supports only one mode
|
|
76
76
|
# if it does, set it as the default mode
|
|
77
77
|
# if it supports multiple modes, set the default mode to 'generate'
|
|
@@ -168,4 +168,4 @@ class OllamaHandler(BaseMLEngine):
|
|
|
168
168
|
'modelfile',
|
|
169
169
|
'parameters',
|
|
170
170
|
'ollama_base_template',
|
|
171
|
-
|
|
171
|
+
])
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import unittest
|
|
2
|
-
import pandas as pd
|
|
3
2
|
from mindsdb.integrations.handlers.opengauss_handler.opengauss_handler import OpenGaussHandler
|
|
4
3
|
|
|
5
4
|
|
|
@@ -42,4 +41,4 @@ class OpenGaussHandlerTest(unittest.TestCase):
|
|
|
42
41
|
|
|
43
42
|
def test_7_select_query(self):
|
|
44
43
|
query = "SELECT * FROM dt_test WHERE 'id'='a'"
|
|
45
|
-
|
|
44
|
+
self.handler.native_query(query)
|
|
@@ -4,7 +4,7 @@ from .__about__ import __version__ as version, __description__ as description
|
|
|
4
4
|
|
|
5
5
|
try:
|
|
6
6
|
from .openstreetmap_handler import OpenStreetMapHandler as Handler
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
import_error = None
|
|
9
9
|
except Exception as e:
|
|
10
10
|
Handler = None
|
|
@@ -16,12 +16,12 @@ type = HANDLER_TYPE.DATA
|
|
|
16
16
|
icon_path = "icon.svg"
|
|
17
17
|
|
|
18
18
|
__all__ = [
|
|
19
|
-
"Handler",
|
|
20
|
-
"version",
|
|
21
|
-
"name",
|
|
22
|
-
"type",
|
|
23
|
-
"title",
|
|
19
|
+
"Handler",
|
|
20
|
+
"version",
|
|
21
|
+
"name",
|
|
22
|
+
"type",
|
|
23
|
+
"title",
|
|
24
24
|
"description",
|
|
25
|
-
"import_error",
|
|
25
|
+
"import_error",
|
|
26
26
|
"icon_path",
|
|
27
27
|
]
|
|
@@ -59,6 +59,12 @@ connection_args = OrderedDict(
|
|
|
59
59
|
"required": False,
|
|
60
60
|
"label": "Auth Mode",
|
|
61
61
|
},
|
|
62
|
+
thick_mode={
|
|
63
|
+
"type": ARG_TYPE.BOOL,
|
|
64
|
+
"description": "Set to `true` to use thick mode for the connection. Thin mode is used by default.",
|
|
65
|
+
"required": False,
|
|
66
|
+
"label": "Connection mode",
|
|
67
|
+
}
|
|
62
68
|
)
|
|
63
69
|
|
|
64
70
|
connection_args_example = OrderedDict(
|