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
|
@@ -14,15 +14,14 @@ from mindsdb.integrations.libs.response import (
|
|
|
14
14
|
import pandas as pd
|
|
15
15
|
import pysqream as db
|
|
16
16
|
|
|
17
|
-
from pysqream_sqlalchemy.dialect import SqreamDialect
|
|
17
|
+
from pysqream_sqlalchemy.dialect import SqreamDialect
|
|
18
18
|
|
|
19
19
|
logger = log.getLogger(__name__)
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class SQreamDBHandler(DatabaseHandler):
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
name= 'sqreamdb'
|
|
24
|
+
name = 'sqreamdb'
|
|
26
25
|
|
|
27
26
|
def __init__(self, name: str, connection_data: Optional[dict], **kwargs):
|
|
28
27
|
""" Initialize the handler
|
|
@@ -32,34 +31,30 @@ class SQreamDBHandler(DatabaseHandler):
|
|
|
32
31
|
**kwargs: arbitrary keyword arguments.
|
|
33
32
|
"""
|
|
34
33
|
super().__init__(name)
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
|
|
37
35
|
self.connection_data = connection_data
|
|
38
36
|
|
|
39
37
|
self.connection = None
|
|
40
38
|
self.is_connected = False
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
|
|
43
40
|
def connect(self):
|
|
44
41
|
"""
|
|
45
42
|
Handles the connection to a YugabyteSQL database insance.
|
|
46
43
|
"""
|
|
47
44
|
if self.is_connected is True:
|
|
48
45
|
return self.connection
|
|
49
|
-
|
|
50
|
-
args={
|
|
46
|
+
|
|
47
|
+
args = {
|
|
51
48
|
"database": self.connection_data.get('database'),
|
|
52
49
|
"host": self.connection_data.get('host'),
|
|
53
50
|
"port": self.connection_data.get('port'),
|
|
54
51
|
"username": self.connection_data.get('user'),
|
|
55
52
|
"password": self.connection_data.get('password'),
|
|
56
|
-
"clustered":self.connection_data.get('clustered',False),
|
|
57
|
-
"use_ssl":self.connection_data.get('use_ssl',False),
|
|
58
|
-
"service":self.connection_data.get('service','sqream')
|
|
53
|
+
"clustered": self.connection_data.get('clustered', False),
|
|
54
|
+
"use_ssl": self.connection_data.get('use_ssl', False),
|
|
55
|
+
"service": self.connection_data.get('service', 'sqream')
|
|
59
56
|
}
|
|
60
57
|
|
|
61
|
-
|
|
62
|
-
|
|
63
58
|
connection = db.connect(**args)
|
|
64
59
|
|
|
65
60
|
self.is_connected = True
|
|
@@ -103,9 +98,9 @@ class SQreamDBHandler(DatabaseHandler):
|
|
|
103
98
|
with conn.cursor() as cur:
|
|
104
99
|
try:
|
|
105
100
|
cur.execute(query)
|
|
106
|
-
|
|
107
|
-
if cur.rowcount >0 and query.upper().startswith('SELECT')
|
|
108
|
-
result = cur.fetchall()
|
|
101
|
+
|
|
102
|
+
if cur.rowcount > 0 and query.upper().startswith('SELECT'):
|
|
103
|
+
result = cur.fetchall()
|
|
109
104
|
response = Response(
|
|
110
105
|
RESPONSE_TYPE.TABLE,
|
|
111
106
|
data_frame=pd.DataFrame(
|
|
@@ -139,7 +134,7 @@ class SQreamDBHandler(DatabaseHandler):
|
|
|
139
134
|
|
|
140
135
|
def get_tables(self) -> Response:
|
|
141
136
|
"""
|
|
142
|
-
List all tables in SQreamDB stored in 'sqream_catalog'
|
|
137
|
+
List all tables in SQreamDB stored in 'sqream_catalog'
|
|
143
138
|
"""
|
|
144
139
|
|
|
145
140
|
query = "SELECT table_name FROM sqream_catalog.tables"
|
|
@@ -147,8 +142,8 @@ class SQreamDBHandler(DatabaseHandler):
|
|
|
147
142
|
return self.query(query)
|
|
148
143
|
|
|
149
144
|
def get_columns(self, table_name):
|
|
150
|
-
query = f"""SELECT column_name, type_name
|
|
151
|
-
FROM sqream_catalog.columns
|
|
145
|
+
query = f"""SELECT column_name, type_name
|
|
146
|
+
FROM sqream_catalog.columns
|
|
152
147
|
WHERE table_name = '{table_name}';
|
|
153
148
|
"""
|
|
154
149
|
return self.query(query)
|
|
@@ -31,15 +31,15 @@ class SQreamDBHandlerTest(unittest.TestCase):
|
|
|
31
31
|
def test_3_get_tables(self):
|
|
32
32
|
tables = self.handler.get_tables()
|
|
33
33
|
assert tables.type is not RESPONSE_TYPE.ERROR
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
def test_4_select_query(self):
|
|
36
36
|
query = "SELECT * FROM AUTHORS"
|
|
37
37
|
result = self.handler.native_query(query)
|
|
38
38
|
assert result.type is RESPONSE_TYPE.TABLE
|
|
39
39
|
|
|
40
40
|
def test_5_check_connection(self):
|
|
41
|
-
|
|
41
|
+
self.handler.check_connection()
|
|
42
|
+
|
|
42
43
|
|
|
43
|
-
|
|
44
44
|
if __name__ == '__main__':
|
|
45
|
-
unittest.main()
|
|
45
|
+
unittest.main()
|
|
@@ -2,6 +2,7 @@ import unittest
|
|
|
2
2
|
from mindsdb.integrations.handlers.starrocks_handler.starrocks_handler import StarRocksHandler
|
|
3
3
|
from mindsdb.integrations.libs.response import RESPONSE_TYPE
|
|
4
4
|
|
|
5
|
+
|
|
5
6
|
class StarRocksHandlerTest(unittest.TestCase):
|
|
6
7
|
@classmethod
|
|
7
8
|
def setUpClass(cls):
|
|
@@ -21,36 +22,33 @@ class StarRocksHandlerTest(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
|
-
|
|
@@ -99,7 +99,7 @@ class StatsForecastHandler(BaseMLEngine):
|
|
|
99
99
|
time_settings = args["timeseries_settings"]
|
|
100
100
|
using_args = args["using"]
|
|
101
101
|
assert time_settings["is_timeseries"], "Specify time series settings in your query"
|
|
102
|
-
|
|
102
|
+
# store model args and time series settings in the model folder
|
|
103
103
|
model_args = {}
|
|
104
104
|
model_args.update(using_args)
|
|
105
105
|
model_args["target"] = target
|
|
@@ -130,7 +130,7 @@ class StatsForecastHandler(BaseMLEngine):
|
|
|
130
130
|
sf = StatsForecast([model], freq=model_args["frequency"], df=training_df)
|
|
131
131
|
fitted_models = sf.fit().fitted_
|
|
132
132
|
|
|
133
|
-
|
|
133
|
+
# persist changes to handler folder
|
|
134
134
|
self.model_storage.json_set("model_args", model_args)
|
|
135
135
|
self.model_storage.file_set("training_df", dill.dumps(training_df))
|
|
136
136
|
self.model_storage.file_set("fitted_models", dill.dumps(fitted_models))
|
|
@@ -7,9 +7,6 @@ from mindsdb.integrations.libs.response import (
|
|
|
7
7
|
from mindsdb.utilities import log
|
|
8
8
|
from mindsdb_sql_parser import parse_sql
|
|
9
9
|
|
|
10
|
-
import requests
|
|
11
|
-
import pandas as pd
|
|
12
|
-
import json
|
|
13
10
|
from collections import OrderedDict
|
|
14
11
|
from mindsdb.integrations.libs.const import HANDLER_CONNECTION_ARG_TYPE as ARG_TYPE
|
|
15
12
|
|
|
@@ -17,6 +14,7 @@ from stravalib.client import Client
|
|
|
17
14
|
|
|
18
15
|
logger = log.getLogger(__name__)
|
|
19
16
|
|
|
17
|
+
|
|
20
18
|
class StravaHandler(APIHandler):
|
|
21
19
|
"""Strava handler implementation"""
|
|
22
20
|
|
|
@@ -39,7 +37,7 @@ class StravaHandler(APIHandler):
|
|
|
39
37
|
|
|
40
38
|
strava_all_clubs_data = StravaAllClubsTable(self)
|
|
41
39
|
self._register_table("all_clubs", strava_all_clubs_data)
|
|
42
|
-
|
|
40
|
+
|
|
43
41
|
strava_club_activites_data = StravaClubActivitesTable(self)
|
|
44
42
|
self._register_table("club_activities", strava_club_activites_data)
|
|
45
43
|
|
|
@@ -54,7 +52,6 @@ class StravaHandler(APIHandler):
|
|
|
54
52
|
return self.connection
|
|
55
53
|
|
|
56
54
|
client = Client()
|
|
57
|
-
url = client.authorization_url(client_id=self.connection_data['strava_client_id'], redirect_uri='http://127.0.0.1:5000/authorization')
|
|
58
55
|
client.access_token = self.connection_data['strava_access_token']
|
|
59
56
|
self.connection = client
|
|
60
57
|
|
|
@@ -68,7 +65,6 @@ class StravaHandler(APIHandler):
|
|
|
68
65
|
Status confirmation
|
|
69
66
|
"""
|
|
70
67
|
response = StatusResponse(False)
|
|
71
|
-
need_to_close = self.is_connected is False
|
|
72
68
|
|
|
73
69
|
try:
|
|
74
70
|
self.connect()
|
|
@@ -108,6 +104,6 @@ connection_args = OrderedDict(
|
|
|
108
104
|
)
|
|
109
105
|
|
|
110
106
|
connection_args_example = OrderedDict(
|
|
111
|
-
strava_client_id
|
|
112
|
-
strava_access_token
|
|
107
|
+
strava_client_id='<your-strava-client_id>',
|
|
108
|
+
strava_access_token='<your-strava-api-token>'
|
|
113
109
|
)
|
|
@@ -8,12 +8,10 @@ from mindsdb.utilities import log
|
|
|
8
8
|
|
|
9
9
|
from mindsdb_sql_parser import ast
|
|
10
10
|
|
|
11
|
-
import requests
|
|
12
|
-
import pandas as pd
|
|
13
|
-
import json
|
|
14
11
|
|
|
15
12
|
logger = log.getLogger(__name__)
|
|
16
13
|
|
|
14
|
+
|
|
17
15
|
class StravaAllClubsTable(APITable):
|
|
18
16
|
"""Strava List all Clubs Table implementation"""
|
|
19
17
|
|
|
@@ -32,7 +30,6 @@ class StravaAllClubsTable(APITable):
|
|
|
32
30
|
ValueError
|
|
33
31
|
If the query contains an unsupported condition
|
|
34
32
|
"""
|
|
35
|
-
conditions = extract_comparison_conditions(query.where)
|
|
36
33
|
|
|
37
34
|
order_by_conditions = {}
|
|
38
35
|
|
|
@@ -42,7 +39,7 @@ class StravaAllClubsTable(APITable):
|
|
|
42
39
|
|
|
43
40
|
for an_order in query.order_by:
|
|
44
41
|
if an_order.field.parts[0] != "id":
|
|
45
|
-
next
|
|
42
|
+
next
|
|
46
43
|
if an_order.field.parts[1] in self.get_columns():
|
|
47
44
|
order_by_conditions["columns"].append(an_order.field.parts[1])
|
|
48
45
|
|
|
@@ -66,7 +63,6 @@ class StravaAllClubsTable(APITable):
|
|
|
66
63
|
else:
|
|
67
64
|
raise ValueError(f"Unknown query target {type(target)}")
|
|
68
65
|
|
|
69
|
-
|
|
70
66
|
if len(strava_clubs_df) == 0:
|
|
71
67
|
strava_clubs_df = pd.DataFrame([], columns=selected_columns)
|
|
72
68
|
else:
|
|
@@ -93,24 +89,24 @@ class StravaAllClubsTable(APITable):
|
|
|
93
89
|
List of columns
|
|
94
90
|
"""
|
|
95
91
|
return [
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
92
|
+
'id',
|
|
93
|
+
'name',
|
|
94
|
+
'sport_type',
|
|
95
|
+
'city',
|
|
96
|
+
'state',
|
|
97
|
+
'country',
|
|
98
|
+
'member_count',
|
|
103
99
|
]
|
|
104
100
|
|
|
105
101
|
def call_strava_allclubs_api(self):
|
|
106
102
|
"""Pulls all the records from the given and returns it select()
|
|
107
|
-
|
|
103
|
+
|
|
108
104
|
Returns
|
|
109
105
|
-------
|
|
110
106
|
pd.DataFrame of all the records of the "List Athlete Clubs" API end point
|
|
111
107
|
"""
|
|
112
108
|
|
|
113
|
-
clubs = self.handler.connect().get_athlete_clubs()
|
|
109
|
+
clubs = self.handler.connect().get_athlete_clubs()
|
|
114
110
|
|
|
115
111
|
club_cols = self.get_columns()
|
|
116
112
|
data = []
|
|
@@ -153,7 +149,7 @@ class StravaClubActivitesTable(APITable):
|
|
|
153
149
|
|
|
154
150
|
for an_order in query.order_by:
|
|
155
151
|
if an_order.field.parts[0] != "id":
|
|
156
|
-
next
|
|
152
|
+
next
|
|
157
153
|
if an_order.field.parts[1] in self.get_columns():
|
|
158
154
|
order_by_conditions["columns"].append(an_order.field.parts[1])
|
|
159
155
|
|
|
@@ -165,7 +161,7 @@ class StravaClubActivitesTable(APITable):
|
|
|
165
161
|
raise ValueError(
|
|
166
162
|
f"Order by unknown column {an_order.field.parts[1]}"
|
|
167
163
|
)
|
|
168
|
-
|
|
164
|
+
|
|
169
165
|
for a_where in conditions:
|
|
170
166
|
if a_where[1] == "strava_club_id":
|
|
171
167
|
if a_where[0] != "=":
|
|
@@ -174,7 +170,6 @@ class StravaClubActivitesTable(APITable):
|
|
|
174
170
|
else:
|
|
175
171
|
raise ValueError(f"Unsupported where argument {a_where[1]}")
|
|
176
172
|
|
|
177
|
-
|
|
178
173
|
strava_club_activities_df = self.call_strava_clubactivities_api(a_where[2])
|
|
179
174
|
|
|
180
175
|
selected_columns = []
|
|
@@ -187,7 +182,6 @@ class StravaClubActivitesTable(APITable):
|
|
|
187
182
|
else:
|
|
188
183
|
raise ValueError(f"Unknown query target {type(target)}")
|
|
189
184
|
|
|
190
|
-
|
|
191
185
|
if len(strava_club_activities_df) == 0:
|
|
192
186
|
strava_club_activities_df = pd.DataFrame([], columns=selected_columns)
|
|
193
187
|
else:
|
|
@@ -214,18 +208,18 @@ class StravaClubActivitesTable(APITable):
|
|
|
214
208
|
List of columns
|
|
215
209
|
"""
|
|
216
210
|
return [
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
211
|
+
'name',
|
|
212
|
+
'distance',
|
|
213
|
+
'moving_time',
|
|
214
|
+
'elapsed_time',
|
|
215
|
+
'total_elevation_gain',
|
|
216
|
+
'sport_type',
|
|
217
|
+
'athlete.firstname',
|
|
224
218
|
]
|
|
225
219
|
|
|
226
|
-
def call_strava_clubactivities_api(self,club_id):
|
|
220
|
+
def call_strava_clubactivities_api(self, club_id):
|
|
227
221
|
"""Pulls all the records from the given and returns it select()
|
|
228
|
-
|
|
222
|
+
|
|
229
223
|
Returns
|
|
230
224
|
-------
|
|
231
225
|
pd.DataFrame of all the records of the "getClubActivitiesById" API end point
|
|
@@ -243,5 +237,3 @@ class StravaClubActivitesTable(APITable):
|
|
|
243
237
|
all_strava_club_activities_df = pd.DataFrame(data, columns=club_cols)
|
|
244
238
|
|
|
245
239
|
return all_strava_club_activities_df
|
|
246
|
-
|
|
247
|
-
|
|
@@ -10,6 +10,7 @@ from mindsdb_sql_parser import parse_sql
|
|
|
10
10
|
|
|
11
11
|
logger = log.getLogger(__name__)
|
|
12
12
|
|
|
13
|
+
|
|
13
14
|
class StripeHandler(APIHandler):
|
|
14
15
|
"""
|
|
15
16
|
The Stripe handler implementation.
|
|
@@ -41,7 +42,7 @@ class StripeHandler(APIHandler):
|
|
|
41
42
|
|
|
42
43
|
payment_intents_data = PaymentIntentsTable(self)
|
|
43
44
|
self._register_table("payment_intents", payment_intents_data)
|
|
44
|
-
|
|
45
|
+
|
|
45
46
|
payouts_data = PayoutsTable(self)
|
|
46
47
|
self._register_table("payouts", payouts_data)
|
|
47
48
|
|
|
@@ -80,7 +81,7 @@ class StripeHandler(APIHandler):
|
|
|
80
81
|
stripe.Account.retrieve()
|
|
81
82
|
response.success = True
|
|
82
83
|
except Exception as e:
|
|
83
|
-
logger.error(
|
|
84
|
+
logger.error('Error connecting to Stripe!')
|
|
84
85
|
response.error_message = str(e)
|
|
85
86
|
|
|
86
87
|
self.is_connected = response.success
|
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
import pandas as pd
|
|
2
|
-
|
|
3
2
|
import stripe
|
|
4
3
|
from typing import Text, List, Dict, Any
|
|
5
|
-
from mindsdb_sql_parser import ast
|
|
6
|
-
from mindsdb.integrations.libs.api_handler import APITable
|
|
7
|
-
from mindsdb.integrations.utilities.handlers.query_utilities import INSERTQueryParser, DELETEQueryParser, UPDATEQueryParser, DELETEQueryExecutor, UPDATEQueryExecutor
|
|
8
4
|
|
|
9
5
|
from mindsdb_sql_parser import ast
|
|
10
6
|
from mindsdb.integrations.libs.api_handler import APITable
|
|
11
|
-
|
|
7
|
+
from mindsdb.integrations.utilities.handlers.query_utilities import INSERTQueryParser, DELETEQueryParser, UPDATEQueryParser, DELETEQueryExecutor, UPDATEQueryExecutor
|
|
12
8
|
from mindsdb.integrations.utilities.handlers.query_utilities.select_query_utilities import SELECTQueryParser, SELECTQueryExecutor
|
|
13
|
-
|
|
14
|
-
|
|
15
9
|
from mindsdb.utilities import log
|
|
16
10
|
|
|
17
11
|
logger = log.getLogger(__name__)
|
|
@@ -235,7 +229,7 @@ class ProductsTable(APITable):
|
|
|
235
229
|
|
|
236
230
|
class PaymentIntentsTable(APITable):
|
|
237
231
|
"""The Stripe Payment Intents Table implementation"""
|
|
238
|
-
|
|
232
|
+
|
|
239
233
|
def select(self, query: ast.Select) -> pd.DataFrame:
|
|
240
234
|
"""
|
|
241
235
|
Pulls Stripe Payment Intents data.
|
|
@@ -273,6 +267,7 @@ class PaymentIntentsTable(APITable):
|
|
|
273
267
|
payment_intents_df = select_statement_executor.execute_query()
|
|
274
268
|
|
|
275
269
|
return payment_intents_df
|
|
270
|
+
|
|
276
271
|
def delete(self, query: ast.Delete) -> None:
|
|
277
272
|
"""
|
|
278
273
|
Cancels Stripe Payment Intents and updates the local data.
|
|
@@ -307,22 +302,21 @@ class PaymentIntentsTable(APITable):
|
|
|
307
302
|
payment_intent_ids = canceled_payment_intents_df['id'].tolist()
|
|
308
303
|
self.cancel_payment_intents(payment_intent_ids)
|
|
309
304
|
|
|
310
|
-
|
|
311
305
|
self.payment_intents_df = self.payment_intents_df[~self.payment_intents_df['id'].isin(payment_intent_ids)]
|
|
312
306
|
|
|
313
307
|
def cancel_payment_intents(self, payment_intent_ids: List[str]) -> None:
|
|
314
308
|
stripe = self.handler.connect()
|
|
315
309
|
for payment_intent_id in payment_intent_ids:
|
|
316
310
|
try:
|
|
317
|
-
|
|
311
|
+
|
|
318
312
|
payment_intent = stripe.PaymentIntent.retrieve(payment_intent_id)
|
|
319
313
|
if payment_intent.status in ['requires_payment_method', 'requires_capture', 'requires_confirmation', 'requires_action', 'processing']:
|
|
320
314
|
stripe.PaymentIntent.cancel(payment_intent_id)
|
|
321
315
|
else:
|
|
322
|
-
|
|
316
|
+
logger.warning(f"Payment intent {payment_intent_id} is in status {payment_intent.status} and cannot be canceled.")
|
|
323
317
|
except stripe.error.StripeError as e:
|
|
324
318
|
logger.error(f"Error cancelling payment intent {payment_intent_id}: {str(e)}")
|
|
325
|
-
|
|
319
|
+
|
|
326
320
|
def update(self, query: 'ast.Update') -> None:
|
|
327
321
|
"""
|
|
328
322
|
Updates data in Stripe "POST /v1/payment_intents/:id" API endpoint.
|
|
@@ -358,16 +352,6 @@ class PaymentIntentsTable(APITable):
|
|
|
358
352
|
for payment_intent_id in payment_intent_ids:
|
|
359
353
|
stripe.PaymentIntent.modify(payment_intent_id, **values_to_update)
|
|
360
354
|
|
|
361
|
-
|
|
362
|
-
def get_columns(self) -> List[Text]:
|
|
363
|
-
return pd.json_normalize(self.get_payment_intents(limit=1)).columns.tolist()
|
|
364
|
-
|
|
365
|
-
def get_payment_intents(self, **kwargs) -> List[Dict]:
|
|
366
|
-
payment_intents = stripe.PaymentIntent.list(**kwargs)
|
|
367
|
-
return [payment_intent for payment_intent in payment_intents.data]
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
355
|
def insert(self, query: 'ast.Insert') -> None:
|
|
372
356
|
"""
|
|
373
357
|
Inserts data into Stripe "POST /v1/payment_intents" API endpoint.
|
|
@@ -398,7 +382,7 @@ class PaymentIntentsTable(APITable):
|
|
|
398
382
|
def create_payment_intent(self, payment_intent_data: list) -> None:
|
|
399
383
|
for data in payment_intent_data:
|
|
400
384
|
stripe.PaymentIntent.create(**data)
|
|
401
|
-
|
|
385
|
+
|
|
402
386
|
def get_columns(self) -> List[Text]:
|
|
403
387
|
return pd.json_normalize(self.get_payment_intents(limit=1)).columns.tolist()
|
|
404
388
|
|
|
@@ -407,7 +391,7 @@ class PaymentIntentsTable(APITable):
|
|
|
407
391
|
payment_intents = stripe.PaymentIntent.list(**kwargs)
|
|
408
392
|
return [payment_intent.to_dict() for payment_intent in payment_intents]
|
|
409
393
|
|
|
410
|
-
|
|
394
|
+
|
|
411
395
|
class RefundsTable(APITable):
|
|
412
396
|
"""The Stripe Refund Table implementation"""
|
|
413
397
|
|
|
@@ -455,9 +439,9 @@ class RefundsTable(APITable):
|
|
|
455
439
|
def get_refunds(self, **kwargs) -> List[Dict]:
|
|
456
440
|
stripe = self.handler.connect()
|
|
457
441
|
refunds = stripe.Refund.list(**kwargs)
|
|
458
|
-
return [refund.to_dict() for refund in refunds
|
|
459
|
-
|
|
460
|
-
|
|
442
|
+
return [refund.to_dict() for refund in refunds]
|
|
443
|
+
|
|
444
|
+
|
|
461
445
|
class PayoutsTable(APITable):
|
|
462
446
|
"""The Stripe Payouts Table implementation"""
|
|
463
447
|
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
from typing import Optional
|
|
2
|
+
import pysurrealdb as surreal
|
|
3
|
+
import pandas as pd
|
|
4
|
+
|
|
2
5
|
from mindsdb_sql_parser.ast.base import ASTNode
|
|
3
6
|
from mindsdb.integrations.libs.base import DatabaseHandler
|
|
4
7
|
from mindsdb.utilities import log
|
|
@@ -8,10 +11,7 @@ from mindsdb.integrations.libs.response import (
|
|
|
8
11
|
HandlerResponse as Response,
|
|
9
12
|
RESPONSE_TYPE
|
|
10
13
|
)
|
|
11
|
-
from .utils.surreal_get_info import
|
|
12
|
-
|
|
13
|
-
import pysurrealdb as surreal
|
|
14
|
-
import pandas as pd
|
|
14
|
+
from .utils.surreal_get_info import table_names, column_info
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
logger = log.getLogger(__name__)
|
|
@@ -18,6 +18,7 @@ from mindsdb.integrations.libs.response import (
|
|
|
18
18
|
|
|
19
19
|
logger = log.getLogger(__name__)
|
|
20
20
|
|
|
21
|
+
|
|
21
22
|
class TDEngineHandler(DatabaseHandler):
|
|
22
23
|
"""
|
|
23
24
|
This handler handles connection and execution of the TDEngine statements.
|
|
@@ -27,7 +28,7 @@ class TDEngineHandler(DatabaseHandler):
|
|
|
27
28
|
|
|
28
29
|
def __init__(self, name, connection_data: Optional[dict], **kwargs):
|
|
29
30
|
super().__init__(name)
|
|
30
|
-
|
|
31
|
+
|
|
31
32
|
self.parser = parse_sql
|
|
32
33
|
self.dialect = 'tdengine'
|
|
33
34
|
self.kwargs = kwargs
|
|
@@ -36,7 +37,6 @@ class TDEngineHandler(DatabaseHandler):
|
|
|
36
37
|
self.connection = None
|
|
37
38
|
self.is_connected = False
|
|
38
39
|
|
|
39
|
-
|
|
40
40
|
def connect(self):
|
|
41
41
|
if self.is_connected is True:
|
|
42
42
|
return self.connection
|
|
@@ -44,8 +44,8 @@ class TDEngineHandler(DatabaseHandler):
|
|
|
44
44
|
config = {
|
|
45
45
|
'url': self.connection_data.get('url', "http://localhost:6041"),
|
|
46
46
|
'token': self.connection_data.get('token'),
|
|
47
|
-
'user': self.connection_data.get('user','root'),
|
|
48
|
-
'password': self.connection_data.get('password','taosdata'),
|
|
47
|
+
'user': self.connection_data.get('user', 'root'),
|
|
48
|
+
'password': self.connection_data.get('password', 'taosdata'),
|
|
49
49
|
'database': self.connection_data.get('database')
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -62,7 +62,7 @@ class TDEngineHandler(DatabaseHandler):
|
|
|
62
62
|
return
|
|
63
63
|
|
|
64
64
|
def check_connection(self) -> StatusResponse:
|
|
65
|
-
|
|
65
|
+
|
|
66
66
|
result = StatusResponse(False)
|
|
67
67
|
need_to_close = self.is_connected is False
|
|
68
68
|
|
|
@@ -90,29 +90,29 @@ class TDEngineHandler(DatabaseHandler):
|
|
|
90
90
|
need_to_close = self.is_connected is False
|
|
91
91
|
|
|
92
92
|
connection = self.connect()
|
|
93
|
-
cur = connection.cursor()
|
|
93
|
+
cur = connection.cursor()
|
|
94
94
|
try:
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
response = Response(
|
|
100
|
-
RESPONSE_TYPE.TABLE,
|
|
101
|
-
pd.DataFrame(
|
|
102
|
-
result,
|
|
103
|
-
columns=[x[0] for x in cur.description]
|
|
104
|
-
)
|
|
105
|
-
)
|
|
106
|
-
else:
|
|
107
|
-
response = Response(RESPONSE_TYPE.OK)
|
|
108
|
-
connection.commit()
|
|
109
|
-
except Exception as e:
|
|
110
|
-
logger.error(f'Error running query: {query} on {self.connection_data["database"]}!')
|
|
95
|
+
cur.execute(query)
|
|
96
|
+
|
|
97
|
+
if cur.rowcount != 0:
|
|
98
|
+
result = cur.fetchall()
|
|
111
99
|
response = Response(
|
|
112
|
-
RESPONSE_TYPE.
|
|
113
|
-
|
|
100
|
+
RESPONSE_TYPE.TABLE,
|
|
101
|
+
pd.DataFrame(
|
|
102
|
+
result,
|
|
103
|
+
columns=[x[0] for x in cur.description]
|
|
104
|
+
)
|
|
114
105
|
)
|
|
115
|
-
|
|
106
|
+
else:
|
|
107
|
+
response = Response(RESPONSE_TYPE.OK)
|
|
108
|
+
connection.commit()
|
|
109
|
+
except Exception as e:
|
|
110
|
+
logger.error(f'Error running query: {query} on {self.connection_data["database"]}!')
|
|
111
|
+
response = Response(
|
|
112
|
+
RESPONSE_TYPE.ERROR,
|
|
113
|
+
error_message=str(e)
|
|
114
|
+
)
|
|
115
|
+
# connection.rollback()
|
|
116
116
|
cur.close()
|
|
117
117
|
if need_to_close is True:
|
|
118
118
|
self.disconnect()
|
|
@@ -133,7 +133,6 @@ class TDEngineHandler(DatabaseHandler):
|
|
|
133
133
|
"""
|
|
134
134
|
q = 'SHOW TABLES;'
|
|
135
135
|
|
|
136
|
-
|
|
137
136
|
return self.native_query(q)
|
|
138
137
|
|
|
139
138
|
def get_columns(self, table_name) -> Response:
|
|
@@ -142,5 +141,4 @@ class TDEngineHandler(DatabaseHandler):
|
|
|
142
141
|
"""
|
|
143
142
|
q = f'DESCRIBE {table_name};'
|
|
144
143
|
|
|
145
|
-
|
|
146
144
|
return self.native_query(q)
|