MindsDB 25.4.5.0__py3-none-any.whl → 25.5.4.0__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 +1 -1
- mindsdb/__main__.py +215 -185
- mindsdb/api/a2a/__init__.py +0 -0
- mindsdb/api/a2a/__main__.py +114 -0
- mindsdb/api/a2a/a2a_client.py +439 -0
- mindsdb/api/a2a/agent.py +308 -0
- mindsdb/api/a2a/common/__init__.py +0 -0
- mindsdb/api/a2a/common/client/__init__.py +4 -0
- mindsdb/api/a2a/common/client/card_resolver.py +21 -0
- mindsdb/api/a2a/common/client/client.py +86 -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 +129 -0
- mindsdb/api/a2a/task_manager.py +594 -0
- mindsdb/api/executor/command_executor.py +49 -28
- mindsdb/api/executor/datahub/classes/response.py +5 -2
- mindsdb/api/executor/datahub/datanodes/information_schema_datanode.py +8 -0
- mindsdb/api/executor/datahub/datanodes/integration_datanode.py +39 -72
- mindsdb/api/executor/datahub/datanodes/system_tables.py +10 -13
- mindsdb/api/executor/planner/query_planner.py +14 -2
- 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 +11 -13
- 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 +118 -85
- mindsdb/api/http/namespaces/analysis.py +17 -4
- mindsdb/api/http/namespaces/file.py +8 -2
- mindsdb/api/http/namespaces/sql.py +13 -27
- mindsdb/api/http/namespaces/tree.py +1 -1
- mindsdb/api/http/start.py +7 -2
- 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 +86 -123
- mindsdb/api/mysql/mysql_proxy/utilities/dump.py +351 -0
- mindsdb/api/mysql/mysql_proxy/utilities/exceptions.py +0 -4
- mindsdb/api/postgres/postgres_proxy/executor/executor.py +1 -1
- mindsdb/api/postgres/postgres_proxy/postgres_packets/postgres_message_formats.py +2 -2
- 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/requirements.txt +1 -0
- 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/chromadb_handler/requirements.txt +1 -0
- 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/gmail_handler/requirements.txt +1 -0
- mindsdb/integrations/handlers/google_analytics_handler/requirements.txt +2 -1
- 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_books_handler/requirements.txt +1 -1
- 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_calendar_handler/requirements.txt +1 -0
- 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_content_shopping_handler/requirements.txt +1 -1
- 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_fit_handler/requirements.txt +2 -0
- 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/google_search_handler/requirements.txt +1 -1
- 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.archived.py +75 -0
- mindsdb/integrations/handlers/jira_handler/jira_handler.py +113 -38
- mindsdb/integrations/handlers/jira_handler/jira_tables.py +229 -0
- mindsdb/integrations/handlers/jira_handler/requirements.txt +1 -0
- mindsdb/integrations/handlers/kinetica_handler/__init__.py +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/lightfm_handler/requirements.txt +1 -0
- mindsdb/integrations/handlers/lightwood_handler/functions.py +2 -2
- mindsdb/integrations/handlers/lightwood_handler/lightwood_handler.py +0 -3
- mindsdb/integrations/handlers/lightwood_handler/requirements.txt +4 -4
- mindsdb/integrations/handlers/lightwood_handler/tests/test_lightwood_handler.py +11 -11
- mindsdb/integrations/handlers/lindorm_handler/requirements.txt +1 -0
- 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_one_drive_handler/requirements.txt +2 -0
- 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/ms_teams_handler/requirements.txt +3 -1
- 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/openai_handler/openai_handler.py +5 -4
- 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/requirements.txt +1 -1
- 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/requirements.txt +1 -0
- 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/requirements.txt +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/response.py +67 -52
- mindsdb/integrations/libs/vectordatabase_handler.py +6 -0
- mindsdb/integrations/utilities/files/file_reader.py +5 -2
- 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/utils.py +3 -3
- mindsdb/interfaces/agents/agents_controller.py +164 -1
- mindsdb/interfaces/agents/constants.py +29 -2
- mindsdb/interfaces/agents/langchain_agent.py +18 -8
- mindsdb/interfaces/agents/mindsdb_database_agent.py +101 -2
- mindsdb/interfaces/database/projects.py +1 -7
- mindsdb/interfaces/functions/controller.py +11 -14
- mindsdb/interfaces/functions/to_markdown.py +9 -124
- mindsdb/interfaces/knowledge_base/controller.py +47 -19
- mindsdb/interfaces/knowledge_base/preprocessing/document_preprocessor.py +41 -15
- mindsdb/interfaces/knowledge_base/preprocessing/json_chunker.py +434 -0
- mindsdb/interfaces/knowledge_base/preprocessing/models.py +54 -0
- mindsdb/interfaces/knowledge_base/utils.py +10 -15
- mindsdb/interfaces/model/model_controller.py +0 -2
- 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 +238 -28
- 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 -9
- mindsdb/migrations/versions/2025-05-21_9f150e4f9a05_checkpoint_1.py +360 -0
- mindsdb/utilities/config.py +333 -220
- mindsdb/utilities/context.py +1 -1
- mindsdb/utilities/functions.py +0 -36
- mindsdb/utilities/langfuse.py +19 -10
- mindsdb/utilities/otel/__init__.py +9 -193
- mindsdb/utilities/otel/metric_handlers/__init__.py +5 -1
- mindsdb/utilities/otel/prepare.py +198 -0
- mindsdb/utilities/sql.py +83 -0
- mindsdb/utilities/starters.py +13 -0
- {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/METADATA +351 -338
- {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/RECORD +348 -322
- {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/WHEEL +1 -1
- mindsdb/api/mysql/mysql_proxy/classes/sql_statement_parser.py +0 -151
- mindsdb/integrations/handlers/monkeylearn_handler/requirements.txt +0 -1
- {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/licenses/LICENSE +0 -0
- {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/top_level.txt +0 -0
|
@@ -5,7 +5,6 @@ from typing import Optional
|
|
|
5
5
|
from functools import reduce
|
|
6
6
|
|
|
7
7
|
import pandas as pd
|
|
8
|
-
from mindsdb_evaluator.accuracy.general import evaluate_accuracy
|
|
9
8
|
from mindsdb_sql_parser import parse_sql
|
|
10
9
|
from mindsdb_sql_parser.ast import (
|
|
11
10
|
Alter,
|
|
@@ -35,6 +34,7 @@ from mindsdb_sql_parser.ast import (
|
|
|
35
34
|
Use,
|
|
36
35
|
Tuple,
|
|
37
36
|
Function,
|
|
37
|
+
Variable,
|
|
38
38
|
)
|
|
39
39
|
|
|
40
40
|
# typed models
|
|
@@ -50,6 +50,7 @@ from mindsdb_sql_parser.ast.mindsdb import (
|
|
|
50
50
|
CreateSkill,
|
|
51
51
|
CreateTrigger,
|
|
52
52
|
CreateView,
|
|
53
|
+
CreateKnowledgeBaseIndex,
|
|
53
54
|
DropAgent,
|
|
54
55
|
DropChatBot,
|
|
55
56
|
DropDatasource,
|
|
@@ -102,6 +103,7 @@ from mindsdb.interfaces.model.functions import (
|
|
|
102
103
|
)
|
|
103
104
|
from mindsdb.interfaces.query_context.context_controller import query_context_controller
|
|
104
105
|
from mindsdb.interfaces.triggers.triggers_controller import TriggersController
|
|
106
|
+
from mindsdb.interfaces.variables.variables_controller import variables_controller
|
|
105
107
|
from mindsdb.utilities.context import context as ctx
|
|
106
108
|
from mindsdb.utilities.functions import mark_process, resolve_model_identifier, get_handler_install_message
|
|
107
109
|
from mindsdb.utilities.exception import EntityExistsError, EntityNotExistsError
|
|
@@ -337,7 +339,7 @@ class ExecuteCommands:
|
|
|
337
339
|
df2 = query_df(df, new_statement)
|
|
338
340
|
|
|
339
341
|
return ExecuteAnswer(
|
|
340
|
-
data=ResultSet
|
|
342
|
+
data=ResultSet.from_df(df2, table_name="session_variables")
|
|
341
343
|
)
|
|
342
344
|
elif sql_category == "search_path":
|
|
343
345
|
return ExecuteAnswer(
|
|
@@ -512,28 +514,30 @@ class ExecuteCommands:
|
|
|
512
514
|
return ExecuteAnswer()
|
|
513
515
|
elif statement_type is Set:
|
|
514
516
|
category = (statement.category or "").lower()
|
|
515
|
-
if category == ""
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
517
|
+
if category == "":
|
|
518
|
+
if isinstance(statement.name, Identifier):
|
|
519
|
+
param = statement.name.parts[0].lower()
|
|
520
|
+
|
|
521
|
+
value = None
|
|
522
|
+
if isinstance(statement.value, Constant):
|
|
523
|
+
value = statement.value.value
|
|
524
|
+
|
|
525
|
+
if param == "profiling":
|
|
526
|
+
self.session.profiling = value in (1, True)
|
|
527
|
+
if self.session.profiling is True:
|
|
528
|
+
profiler.enable()
|
|
529
|
+
else:
|
|
530
|
+
profiler.disable()
|
|
531
|
+
elif param == "predictor_cache":
|
|
532
|
+
self.session.predictor_cache = value in (1, True)
|
|
533
|
+
elif param == "context":
|
|
534
|
+
if value in (0, False, None):
|
|
535
|
+
# drop context
|
|
536
|
+
query_context_controller.drop_query_context(None)
|
|
537
|
+
elif param == "show_secrets":
|
|
538
|
+
self.session.show_secrets = value in (1, True)
|
|
539
|
+
elif isinstance(statement.name, Variable):
|
|
540
|
+
variables_controller.set_variable(statement.name.value, statement.value)
|
|
537
541
|
return ExecuteAnswer()
|
|
538
542
|
elif category == "autocommit":
|
|
539
543
|
return ExecuteAnswer()
|
|
@@ -650,6 +654,8 @@ class ExecuteCommands:
|
|
|
650
654
|
elif statement_type is Evaluate:
|
|
651
655
|
statement.data = parse_sql(statement.query_str)
|
|
652
656
|
return self.answer_evaluate_metric(statement, database_name)
|
|
657
|
+
elif statement_type is CreateKnowledgeBaseIndex:
|
|
658
|
+
return self.answer_create_kb_index(statement, database_name)
|
|
653
659
|
else:
|
|
654
660
|
logger.warning(f"Unknown SQL statement: {sql}")
|
|
655
661
|
raise NotSupportedYet(f"Unknown SQL statement: {sql}")
|
|
@@ -814,6 +820,8 @@ class ExecuteCommands:
|
|
|
814
820
|
return ExecuteAnswer()
|
|
815
821
|
|
|
816
822
|
def answer_evaluate_metric(self, statement, database_name):
|
|
823
|
+
# heavy import, so we do it here on-demand
|
|
824
|
+
from mindsdb_evaluator.accuracy.general import evaluate_accuracy
|
|
817
825
|
try:
|
|
818
826
|
sqlquery = SQLQuery(statement.data, session=self.session, database=database_name)
|
|
819
827
|
except Exception as e:
|
|
@@ -935,8 +943,18 @@ class ExecuteCommands:
|
|
|
935
943
|
)
|
|
936
944
|
|
|
937
945
|
return ExecuteAnswer(
|
|
938
|
-
data=ResultSet
|
|
946
|
+
data=ResultSet.from_df(df, table_name="")
|
|
947
|
+
)
|
|
948
|
+
|
|
949
|
+
def answer_create_kb_index(self, statement, database_name):
|
|
950
|
+
table_name = statement.name.parts[-1]
|
|
951
|
+
project_name = (
|
|
952
|
+
statement.name.parts[0]
|
|
953
|
+
if len(statement.name.parts) > 1
|
|
954
|
+
else database_name
|
|
939
955
|
)
|
|
956
|
+
self.session.kb_controller.create_index(table_name=table_name, project_name=project_name)
|
|
957
|
+
return ExecuteAnswer()
|
|
940
958
|
|
|
941
959
|
def _get_model_info(self, identifier, except_absent=True, database_name=None):
|
|
942
960
|
if len(identifier.parts) == 1:
|
|
@@ -967,6 +985,9 @@ class ExecuteCommands:
|
|
|
967
985
|
"""Checks if there is already a predictor retraining or fine-tuning
|
|
968
986
|
Do not allow to run retrain if there is another model in training process in less that 1h
|
|
969
987
|
"""
|
|
988
|
+
if ctx.company_id is None:
|
|
989
|
+
# bypass for tests
|
|
990
|
+
return
|
|
970
991
|
is_cloud = self.session.config.get("cloud", False)
|
|
971
992
|
if is_cloud and ctx.user_class == 0:
|
|
972
993
|
models = get_model_records(active=None)
|
|
@@ -1031,7 +1052,7 @@ class ExecuteCommands:
|
|
|
1031
1052
|
df = self.session.model_controller.retrain_model(statement, ml_handler)
|
|
1032
1053
|
|
|
1033
1054
|
return ExecuteAnswer(
|
|
1034
|
-
data=ResultSet
|
|
1055
|
+
data=ResultSet.from_df(df)
|
|
1035
1056
|
)
|
|
1036
1057
|
|
|
1037
1058
|
@profiler.profile()
|
|
@@ -1061,7 +1082,7 @@ class ExecuteCommands:
|
|
|
1061
1082
|
df = self.session.model_controller.finetune_model(statement, ml_handler)
|
|
1062
1083
|
|
|
1063
1084
|
return ExecuteAnswer(
|
|
1064
|
-
data=ResultSet
|
|
1085
|
+
data=ResultSet.from_df(df)
|
|
1065
1086
|
)
|
|
1066
1087
|
|
|
1067
1088
|
def _create_integration(self, name: str, engine: str, connection_args: dict):
|
|
@@ -1571,7 +1592,7 @@ class ExecuteCommands:
|
|
|
1571
1592
|
try:
|
|
1572
1593
|
df = self.session.model_controller.create_model(statement, ml_handler)
|
|
1573
1594
|
|
|
1574
|
-
return ExecuteAnswer(data=ResultSet
|
|
1595
|
+
return ExecuteAnswer(data=ResultSet.from_df(df))
|
|
1575
1596
|
except EntityExistsError:
|
|
1576
1597
|
if getattr(statement, "if_not_exists", False) is True:
|
|
1577
1598
|
return ExecuteAnswer()
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
from dataclasses import dataclass, field
|
|
2
|
-
from typing import
|
|
2
|
+
from typing import List, Dict
|
|
3
3
|
|
|
4
4
|
import pandas as pd
|
|
5
5
|
|
|
6
|
+
from mindsdb.api.mysql.mysql_proxy.libs.constants.mysql import MYSQL_DATA_TYPE
|
|
7
|
+
|
|
6
8
|
|
|
7
9
|
@dataclass
|
|
8
10
|
class DataHubResponse:
|
|
9
11
|
data_frame: pd.DataFrame = field(default_factory=pd.DataFrame)
|
|
10
12
|
columns: List[Dict] = field(default_factory=list)
|
|
11
|
-
affected_rows:
|
|
13
|
+
affected_rows: int | None = None
|
|
14
|
+
mysql_types: list[MYSQL_DATA_TYPE] | None = None
|
|
@@ -22,6 +22,8 @@ from .mindsdb_tables import (
|
|
|
22
22
|
ModelsTable, DatabasesTable, MLEnginesTable, HandlersTable, JobsTable, QueriesTable,
|
|
23
23
|
ChatbotsTable, KBTable, SkillsTable, AgentsTable, ViewsTable, TriggersTable)
|
|
24
24
|
|
|
25
|
+
from mindsdb.api.executor.datahub.classes.tables_row import TablesRow
|
|
26
|
+
|
|
25
27
|
|
|
26
28
|
logger = log.getLogger(__name__)
|
|
27
29
|
|
|
@@ -166,6 +168,12 @@ class InformationSchemaDataNode(DataNode):
|
|
|
166
168
|
return [x.lower() for x in projects]
|
|
167
169
|
|
|
168
170
|
def get_tables(self):
|
|
171
|
+
return [
|
|
172
|
+
TablesRow(TABLE_NAME=name)
|
|
173
|
+
for name in self.tables.keys()
|
|
174
|
+
]
|
|
175
|
+
|
|
176
|
+
def get_tree_tables(self):
|
|
169
177
|
return {
|
|
170
178
|
name: table
|
|
171
179
|
for name, table in self.tables.items()
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import time
|
|
2
2
|
import inspect
|
|
3
3
|
from dataclasses import astuple
|
|
4
|
+
from typing import Iterable
|
|
4
5
|
|
|
5
6
|
import numpy as np
|
|
6
|
-
from numpy import dtype as np_dtype
|
|
7
7
|
import pandas as pd
|
|
8
|
-
from pandas.api import types as pd_types
|
|
9
8
|
from sqlalchemy.types import (
|
|
10
|
-
Integer, Float
|
|
9
|
+
Integer, Float
|
|
11
10
|
)
|
|
12
11
|
|
|
13
12
|
from mindsdb_sql_parser.ast.base import ASTNode
|
|
@@ -121,9 +120,7 @@ class IntegrationDataNode(DataNode):
|
|
|
121
120
|
tables=[name],
|
|
122
121
|
if_exists=if_exists
|
|
123
122
|
)
|
|
124
|
-
|
|
125
|
-
if result.type == RESPONSE_TYPE.ERROR:
|
|
126
|
-
raise Exception(result.error_message)
|
|
123
|
+
self.query(drop_ast)
|
|
127
124
|
|
|
128
125
|
def create_table(self, table_name: Identifier, result_set: ResultSet = None, columns=None,
|
|
129
126
|
is_replace=False, is_create=False, **kwargs) -> DataHubResponse:
|
|
@@ -138,27 +135,11 @@ class IntegrationDataNode(DataNode):
|
|
|
138
135
|
|
|
139
136
|
df = result_set.get_raw_df()
|
|
140
137
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if pd_types.is_object_dtype(dtype):
|
|
147
|
-
# try to infer
|
|
148
|
-
dtype = df[idx].infer_objects().dtype
|
|
149
|
-
|
|
150
|
-
if pd_types.is_integer_dtype(dtype):
|
|
151
|
-
column_type = Integer
|
|
152
|
-
elif pd_types.is_numeric_dtype(dtype):
|
|
153
|
-
column_type = Float
|
|
154
|
-
|
|
155
|
-
columns.append(
|
|
156
|
-
TableColumn(
|
|
157
|
-
name=col.alias,
|
|
158
|
-
type=column_type
|
|
159
|
-
)
|
|
160
|
-
)
|
|
161
|
-
table_columns_meta[col.alias] = column_type
|
|
138
|
+
columns: list[TableColumn] = result_set.get_ast_columns()
|
|
139
|
+
table_columns_meta = {
|
|
140
|
+
column.name: column.type
|
|
141
|
+
for column in columns
|
|
142
|
+
}
|
|
162
143
|
|
|
163
144
|
if is_replace:
|
|
164
145
|
# drop
|
|
@@ -166,9 +147,7 @@ class IntegrationDataNode(DataNode):
|
|
|
166
147
|
tables=[table_name],
|
|
167
148
|
if_exists=True
|
|
168
149
|
)
|
|
169
|
-
|
|
170
|
-
if result.type == RESPONSE_TYPE.ERROR:
|
|
171
|
-
raise Exception(result.error_message)
|
|
150
|
+
self.query(drop_ast)
|
|
172
151
|
is_create = True
|
|
173
152
|
|
|
174
153
|
if is_create:
|
|
@@ -177,9 +156,7 @@ class IntegrationDataNode(DataNode):
|
|
|
177
156
|
columns=columns,
|
|
178
157
|
is_replace=is_replace
|
|
179
158
|
)
|
|
180
|
-
|
|
181
|
-
if result.type == RESPONSE_TYPE.ERROR:
|
|
182
|
-
raise Exception(result.error_message)
|
|
159
|
+
self.query(create_table_ast)
|
|
183
160
|
|
|
184
161
|
if result_set is None:
|
|
185
162
|
# it is just a 'create table'
|
|
@@ -224,56 +201,44 @@ class IntegrationDataNode(DataNode):
|
|
|
224
201
|
)
|
|
225
202
|
|
|
226
203
|
try:
|
|
227
|
-
result = self.
|
|
204
|
+
result: DataHubResponse = self.query(insert_ast)
|
|
228
205
|
except Exception as e:
|
|
229
206
|
msg = f'[{self.ds_type}/{self.integration_name}]: {str(e)}'
|
|
230
207
|
raise DBHandlerException(msg) from e
|
|
231
208
|
|
|
232
|
-
if result.type == RESPONSE_TYPE.ERROR:
|
|
233
|
-
raise Exception(result.error_message)
|
|
234
|
-
|
|
235
209
|
return DataHubResponse(affected_rows=result.affected_rows)
|
|
236
210
|
|
|
237
|
-
def
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
num_rows = 0
|
|
246
|
-
if result.data_frame is not None:
|
|
247
|
-
num_rows = len(result.data_frame.index)
|
|
248
|
-
response_size_with_labels = metrics.INTEGRATION_HANDLER_RESPONSE_SIZE.labels(
|
|
249
|
-
get_class_name(self.integration_handler), result.type)
|
|
250
|
-
response_size_with_labels.observe(num_rows)
|
|
251
|
-
return result
|
|
252
|
-
|
|
253
|
-
def _native_query(self, native_query) -> HandlerResponse:
|
|
254
|
-
time_before_query = time.perf_counter()
|
|
255
|
-
result = self.integration_handler.native_query(native_query)
|
|
256
|
-
elapsed_seconds = time.perf_counter() - time_before_query
|
|
257
|
-
query_time_with_labels = metrics.INTEGRATION_HANDLER_QUERY_TIME.labels(
|
|
258
|
-
get_class_name(self.integration_handler), result.type)
|
|
259
|
-
query_time_with_labels.observe(elapsed_seconds)
|
|
260
|
-
|
|
261
|
-
num_rows = 0
|
|
262
|
-
if result.data_frame is not None:
|
|
263
|
-
num_rows = len(result.data_frame.index)
|
|
264
|
-
response_size_with_labels = metrics.INTEGRATION_HANDLER_RESPONSE_SIZE.labels(
|
|
265
|
-
get_class_name(self.integration_handler), result.type)
|
|
266
|
-
response_size_with_labels.observe(num_rows)
|
|
267
|
-
return result
|
|
211
|
+
def has_support_stream(self) -> bool:
|
|
212
|
+
# checks if data handler has query_stream method
|
|
213
|
+
return hasattr(self.integration_handler, 'query_stream') and callable(self.integration_handler.query_stream)
|
|
214
|
+
|
|
215
|
+
@profiler.profile()
|
|
216
|
+
def query_stream(self, query: ASTNode, fetch_size: int = None) -> Iterable:
|
|
217
|
+
# returns generator of results from handler (split by chunks)
|
|
218
|
+
return self.integration_handler.query_stream(query, fetch_size=fetch_size)
|
|
268
219
|
|
|
269
220
|
@profiler.profile()
|
|
270
221
|
def query(self, query: ASTNode | None = None, native_query: str | None = None, session=None) -> DataHubResponse:
|
|
271
222
|
try:
|
|
223
|
+
time_before_query = time.perf_counter()
|
|
272
224
|
if query is not None:
|
|
273
|
-
result: HandlerResponse = self.
|
|
225
|
+
result: HandlerResponse = self.integration_handler.query(query)
|
|
274
226
|
else:
|
|
275
227
|
# try to fetch native query
|
|
276
|
-
result: HandlerResponse = self.
|
|
228
|
+
result: HandlerResponse = self.integration_handler.native_query(native_query)
|
|
229
|
+
|
|
230
|
+
# metrics
|
|
231
|
+
elapsed_seconds = time.perf_counter() - time_before_query
|
|
232
|
+
query_time_with_labels = metrics.INTEGRATION_HANDLER_QUERY_TIME.labels(
|
|
233
|
+
get_class_name(self.integration_handler), result.type)
|
|
234
|
+
query_time_with_labels.observe(elapsed_seconds)
|
|
235
|
+
|
|
236
|
+
num_rows = 0
|
|
237
|
+
if result.data_frame is not None:
|
|
238
|
+
num_rows = len(result.data_frame.index)
|
|
239
|
+
response_size_with_labels = metrics.INTEGRATION_HANDLER_RESPONSE_SIZE.labels(
|
|
240
|
+
get_class_name(self.integration_handler), result.type)
|
|
241
|
+
response_size_with_labels.observe(num_rows)
|
|
277
242
|
except Exception as e:
|
|
278
243
|
msg = str(e).strip()
|
|
279
244
|
if msg == '':
|
|
@@ -294,7 +259,8 @@ class IntegrationDataNode(DataNode):
|
|
|
294
259
|
|
|
295
260
|
try:
|
|
296
261
|
# replace python's Nan, np.NaN, np.nan and pd.NA to None
|
|
297
|
-
|
|
262
|
+
# TODO keep all NAN to the end of processing, bacause replacing also changes dtypes
|
|
263
|
+
df.replace([np.NaN, pd.NA, pd.NaT], None, inplace=True)
|
|
298
264
|
except Exception as e:
|
|
299
265
|
logger.error(f"Issue with clearing DF from NaN values: {e}")
|
|
300
266
|
# endregion
|
|
@@ -310,5 +276,6 @@ class IntegrationDataNode(DataNode):
|
|
|
310
276
|
return DataHubResponse(
|
|
311
277
|
data_frame=df,
|
|
312
278
|
columns=columns_info,
|
|
313
|
-
affected_rows=result.affected_rows
|
|
279
|
+
affected_rows=result.affected_rows,
|
|
280
|
+
mysql_types=result.mysql_types
|
|
314
281
|
)
|
|
@@ -311,20 +311,17 @@ class ColumnsTable(Table):
|
|
|
311
311
|
result = []
|
|
312
312
|
for db_name in databases:
|
|
313
313
|
tables = {}
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
314
|
+
|
|
315
|
+
dn = inf_schema.get(db_name)
|
|
316
|
+
if dn is None:
|
|
317
|
+
continue
|
|
318
|
+
|
|
319
|
+
if tables_names is None:
|
|
320
|
+
list_tables = [t.TABLE_NAME for t in dn.get_tables()]
|
|
319
321
|
else:
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
if tables_names is None:
|
|
325
|
-
tables_names = [t.TABLE_NAME for t in dn.get_tables()]
|
|
326
|
-
for table_name in tables_names:
|
|
327
|
-
tables[table_name] = dn.get_table_columns_df(table_name)
|
|
322
|
+
list_tables = tables_names
|
|
323
|
+
for table_name in list_tables:
|
|
324
|
+
tables[table_name] = dn.get_table_columns_df(table_name)
|
|
328
325
|
|
|
329
326
|
for table_name, table_columns_df in tables.items():
|
|
330
327
|
for _, row in table_columns_df.iterrows():
|
|
@@ -29,6 +29,9 @@ from mindsdb.utilities.config import config
|
|
|
29
29
|
|
|
30
30
|
default_project = config.get('default_project')
|
|
31
31
|
|
|
32
|
+
# This includes built-in MindsDB SQL functions and functions to be executed via DuckDB consistently.
|
|
33
|
+
MINDSDB_SQL_FUNCTIONS = {'llm', 'to_markdown', 'hash'}
|
|
34
|
+
|
|
32
35
|
|
|
33
36
|
class QueryPlanner:
|
|
34
37
|
|
|
@@ -237,7 +240,7 @@ class QueryPlanner:
|
|
|
237
240
|
|
|
238
241
|
def find_objects(node, is_table, **kwargs):
|
|
239
242
|
if isinstance(node, Function):
|
|
240
|
-
if node.namespace is not None or node.op.lower() in
|
|
243
|
+
if node.namespace is not None or node.op.lower() in MINDSDB_SQL_FUNCTIONS:
|
|
241
244
|
user_functions.append(node)
|
|
242
245
|
|
|
243
246
|
if is_table:
|
|
@@ -845,11 +848,12 @@ class QueryPlanner:
|
|
|
845
848
|
"""
|
|
846
849
|
|
|
847
850
|
# handle fetchdataframe partitioning
|
|
851
|
+
steps_in = plan.steps
|
|
848
852
|
steps_out = []
|
|
849
853
|
|
|
850
854
|
step = None
|
|
851
855
|
partition_step = None
|
|
852
|
-
for step in
|
|
856
|
+
for step in steps_in:
|
|
853
857
|
if isinstance(step, FetchDataframeStep) and step.params is not None:
|
|
854
858
|
batch_size = step.params.get('batch_size')
|
|
855
859
|
if batch_size is not None:
|
|
@@ -902,6 +906,14 @@ class QueryPlanner:
|
|
|
902
906
|
|
|
903
907
|
if plan.is_resumable and isinstance(step, InsertToTable):
|
|
904
908
|
plan.is_async = True
|
|
909
|
+
else:
|
|
910
|
+
# special case: register insert from select (it is the same as mark resumable)
|
|
911
|
+
if (
|
|
912
|
+
len(steps_in) == 2
|
|
913
|
+
and isinstance(steps_in[0], FetchDataframeStep)
|
|
914
|
+
and isinstance(steps_in[1], InsertToTable)
|
|
915
|
+
):
|
|
916
|
+
plan.is_resumable = True
|
|
905
917
|
|
|
906
918
|
plan.steps = steps_out
|
|
907
919
|
return plan
|