MindsDB 25.5.3.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 +127 -79
- 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 +47 -27
- mindsdb/api/executor/datahub/classes/response.py +5 -2
- mindsdb/api/executor/datahub/datanodes/integration_datanode.py +39 -72
- mindsdb/api/executor/planner/query_planner.py +10 -1
- mindsdb/api/executor/sql_query/result_set.py +185 -52
- mindsdb/api/executor/sql_query/sql_query.py +1 -1
- mindsdb/api/executor/sql_query/steps/apply_predictor_step.py +9 -12
- mindsdb/api/executor/sql_query/steps/fetch_dataframe.py +8 -10
- mindsdb/api/executor/sql_query/steps/fetch_dataframe_partition.py +5 -44
- mindsdb/api/executor/sql_query/steps/insert_step.py +24 -15
- mindsdb/api/executor/sql_query/steps/join_step.py +1 -1
- mindsdb/api/executor/sql_query/steps/project_step.py +1 -1
- mindsdb/api/executor/sql_query/steps/sql_steps.py +1 -1
- mindsdb/api/executor/sql_query/steps/subselect_step.py +4 -8
- mindsdb/api/executor/sql_query/steps/union_step.py +1 -3
- mindsdb/api/http/initialize.py +99 -83
- mindsdb/api/http/namespaces/analysis.py +3 -3
- mindsdb/api/http/namespaces/file.py +8 -2
- mindsdb/api/http/namespaces/sql.py +13 -27
- mindsdb/api/mcp/start.py +42 -5
- mindsdb/api/mysql/mysql_proxy/data_types/mysql_packet.py +0 -1
- mindsdb/api/mysql/mysql_proxy/data_types/mysql_packets/binary_resultset_row_package.py +52 -19
- mindsdb/api/mysql/mysql_proxy/executor/mysql_executor.py +8 -10
- mindsdb/api/mysql/mysql_proxy/libs/constants/mysql.py +54 -38
- mindsdb/api/mysql/mysql_proxy/mysql_proxy.py +82 -115
- mindsdb/api/mysql/mysql_proxy/utilities/dump.py +351 -0
- mindsdb/api/postgres/postgres_proxy/executor/executor.py +1 -1
- mindsdb/api/postgres/postgres_proxy/postgres_proxy.py +5 -6
- mindsdb/integrations/handlers/altibase_handler/altibase_handler.py +26 -27
- mindsdb/integrations/handlers/altibase_handler/connection_args.py +13 -13
- mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler.py +8 -8
- mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler_dsn.py +13 -13
- mindsdb/integrations/handlers/anthropic_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/anthropic_handler/anthropic_handler.py +1 -3
- mindsdb/integrations/handlers/aurora_handler/aurora_handler.py +1 -0
- mindsdb/integrations/handlers/autosklearn_handler/autosklearn_handler.py +1 -1
- mindsdb/integrations/handlers/autosklearn_handler/config.py +0 -1
- mindsdb/integrations/handlers/bigquery_handler/bigquery_handler.py +1 -1
- mindsdb/integrations/handlers/bigquery_handler/tests/test_bigquery_handler.py +1 -1
- mindsdb/integrations/handlers/binance_handler/binance_handler.py +1 -0
- mindsdb/integrations/handlers/binance_handler/binance_tables.py +3 -4
- mindsdb/integrations/handlers/byom_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/ckan_handler/ckan_handler.py +3 -0
- mindsdb/integrations/handlers/clickhouse_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/cloud_spanner_handler/tests/test_cloud_spanner_handler.py +0 -2
- mindsdb/integrations/handlers/cloud_sql_handler/cloud_sql_handler.py +0 -1
- mindsdb/integrations/handlers/cohere_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/cohere_handler/cohere_handler.py +11 -13
- mindsdb/integrations/handlers/confluence_handler/confluence_tables.py +6 -0
- mindsdb/integrations/handlers/databend_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/databend_handler/databend_handler.py +4 -4
- mindsdb/integrations/handlers/databend_handler/tests/__init__.py +0 -1
- mindsdb/integrations/handlers/databend_handler/tests/test_databend_handler.py +1 -1
- mindsdb/integrations/handlers/derby_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/derby_handler/derby_handler.py +14 -22
- mindsdb/integrations/handlers/derby_handler/tests/test_derby_handler.py +6 -6
- mindsdb/integrations/handlers/discord_handler/discord_handler.py +5 -5
- mindsdb/integrations/handlers/discord_handler/discord_tables.py +3 -3
- mindsdb/integrations/handlers/discord_handler/tests/test_discord.py +5 -3
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub.py +3 -3
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub_handler.py +2 -2
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub_tables.py +57 -54
- mindsdb/integrations/handlers/dremio_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/druid_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/druid_handler/druid_handler.py +2 -2
- mindsdb/integrations/handlers/edgelessdb_handler/tests/test_edgelessdb_handler.py +9 -9
- mindsdb/integrations/handlers/email_handler/email_client.py +1 -1
- mindsdb/integrations/handlers/email_handler/email_ingestor.py +1 -1
- mindsdb/integrations/handlers/email_handler/email_tables.py +0 -1
- mindsdb/integrations/handlers/email_handler/settings.py +0 -1
- mindsdb/integrations/handlers/eventstoredb_handler/eventstoredb_handler.py +2 -1
- mindsdb/integrations/handlers/firebird_handler/firebird_handler.py +1 -1
- mindsdb/integrations/handlers/flaml_handler/flaml_handler.py +9 -9
- mindsdb/integrations/handlers/frappe_handler/frappe_client.py +5 -5
- mindsdb/integrations/handlers/frappe_handler/frappe_handler.py +6 -5
- mindsdb/integrations/handlers/frappe_handler/frappe_tables.py +2 -2
- mindsdb/integrations/handlers/github_handler/connection_args.py +2 -2
- mindsdb/integrations/handlers/github_handler/github_handler.py +1 -8
- mindsdb/integrations/handlers/github_handler/github_tables.py +13 -24
- mindsdb/integrations/handlers/gitlab_handler/gitlab_handler.py +2 -1
- mindsdb/integrations/handlers/gitlab_handler/gitlab_tables.py +1 -4
- mindsdb/integrations/handlers/gmail_handler/gmail_handler.py +6 -13
- mindsdb/integrations/handlers/google_books_handler/google_books_handler.py +2 -1
- mindsdb/integrations/handlers/google_books_handler/google_books_tables.py +0 -3
- mindsdb/integrations/handlers/google_calendar_handler/google_calendar_handler.py +4 -4
- mindsdb/integrations/handlers/google_calendar_handler/google_calendar_tables.py +2 -6
- mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_handler.py +3 -2
- mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_tables.py +0 -3
- mindsdb/integrations/handlers/google_fit_handler/google_fit_handler.py +10 -12
- mindsdb/integrations/handlers/google_fit_handler/google_fit_tables.py +11 -13
- mindsdb/integrations/handlers/google_search_handler/google_search_handler.py +2 -1
- mindsdb/integrations/handlers/google_search_handler/google_search_tables.py +0 -3
- mindsdb/integrations/handlers/groq_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/hackernews_handler/hn_handler.py +5 -7
- mindsdb/integrations/handlers/hackernews_handler/hn_table.py +6 -7
- mindsdb/integrations/handlers/hive_handler/tests/test_hive_handler.py +1 -1
- mindsdb/integrations/handlers/hsqldb_handler/connection_args.py +6 -6
- mindsdb/integrations/handlers/hsqldb_handler/hsqldb_handler.py +4 -3
- mindsdb/integrations/handlers/huggingface_api_handler/exceptions.py +1 -1
- mindsdb/integrations/handlers/huggingface_api_handler/huggingface_api_handler.py +1 -8
- mindsdb/integrations/handlers/huggingface_handler/huggingface_handler.py +6 -6
- mindsdb/integrations/handlers/huggingface_handler/requirements.txt +1 -1
- mindsdb/integrations/handlers/huggingface_handler/requirements_cpu.txt +1 -1
- mindsdb/integrations/handlers/ignite_handler/ignite_handler.py +2 -1
- mindsdb/integrations/handlers/impala_handler/impala_handler.py +9 -12
- mindsdb/integrations/handlers/impala_handler/tests/test_impala_handler.py +11 -11
- mindsdb/integrations/handlers/influxdb_handler/influxdb_handler.py +10 -13
- mindsdb/integrations/handlers/influxdb_handler/influxdb_tables.py +20 -20
- mindsdb/integrations/handlers/informix_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/informix_handler/__init__.py +12 -5
- mindsdb/integrations/handlers/informix_handler/informix_handler.py +99 -133
- mindsdb/integrations/handlers/informix_handler/tests/test_informix_handler.py +13 -11
- mindsdb/integrations/handlers/ingres_handler/__about__.py +0 -1
- mindsdb/integrations/handlers/ingres_handler/ingres_handler.py +1 -0
- mindsdb/integrations/handlers/jira_handler/jira_handler.py +4 -4
- mindsdb/integrations/handlers/jira_handler/jira_tables.py +9 -9
- mindsdb/integrations/handlers/kinetica_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +4 -4
- mindsdb/integrations/handlers/langchain_handler/tools.py +9 -10
- mindsdb/integrations/handlers/leonardoai_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/lightwood_handler/functions.py +2 -2
- mindsdb/integrations/handlers/lightwood_handler/lightwood_handler.py +0 -1
- mindsdb/integrations/handlers/lightwood_handler/tests/test_lightwood_handler.py +11 -11
- mindsdb/integrations/handlers/llama_index_handler/llama_index_handler.py +4 -4
- mindsdb/integrations/handlers/llama_index_handler/settings.py +10 -9
- mindsdb/integrations/handlers/materialize_handler/tests/test_materialize_handler.py +8 -10
- mindsdb/integrations/handlers/matrixone_handler/matrixone_handler.py +4 -4
- mindsdb/integrations/handlers/matrixone_handler/tests/test_matrixone_handler.py +8 -9
- mindsdb/integrations/handlers/maxdb_handler/connection_args.py +25 -25
- mindsdb/integrations/handlers/maxdb_handler/maxdb_handler.py +1 -0
- mindsdb/integrations/handlers/mediawiki_handler/mediawiki_handler.py +3 -2
- mindsdb/integrations/handlers/mediawiki_handler/mediawiki_tables.py +1 -1
- mindsdb/integrations/handlers/mendeley_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/mendeley_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/mendeley_handler/mendeley_handler.py +48 -56
- mindsdb/integrations/handlers/mendeley_handler/mendeley_tables.py +24 -29
- mindsdb/integrations/handlers/mendeley_handler/tests/test_mendeley_handler.py +19 -17
- mindsdb/integrations/handlers/merlion_handler/merlion_handler.py +5 -4
- mindsdb/integrations/handlers/minds_endpoint_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/mlflow_handler/mlflow_handler.py +58 -36
- mindsdb/integrations/handlers/monetdb_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/monetdb_handler/__init__.py +15 -5
- mindsdb/integrations/handlers/monetdb_handler/connection_args.py +17 -18
- mindsdb/integrations/handlers/monetdb_handler/monetdb_handler.py +40 -57
- mindsdb/integrations/handlers/monetdb_handler/tests/test_monetdb_handler.py +7 -8
- mindsdb/integrations/handlers/monetdb_handler/utils/monet_get_id.py +13 -14
- mindsdb/integrations/handlers/monkeylearn_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/monkeylearn_handler.py +2 -5
- mindsdb/integrations/handlers/ms_one_drive_handler/ms_graph_api_one_drive_client.py +1 -0
- mindsdb/integrations/handlers/ms_one_drive_handler/ms_one_drive_handler.py +1 -1
- mindsdb/integrations/handlers/ms_teams_handler/ms_graph_api_teams_client.py +23 -23
- mindsdb/integrations/handlers/ms_teams_handler/ms_teams_handler.py +3 -3
- mindsdb/integrations/handlers/ms_teams_handler/ms_teams_tables.py +10 -5
- mindsdb/integrations/handlers/mssql_handler/mssql_handler.py +73 -8
- mindsdb/integrations/handlers/mysql_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/mysql_handler/__init__.py +15 -5
- mindsdb/integrations/handlers/mysql_handler/connection_args.py +43 -47
- mindsdb/integrations/handlers/mysql_handler/mysql_handler.py +101 -34
- mindsdb/integrations/handlers/mysql_handler/settings.py +15 -13
- mindsdb/integrations/handlers/neuralforecast_handler/neuralforecast_handler.py +1 -1
- mindsdb/integrations/handlers/newsapi_handler/newsapi_handler.py +1 -1
- mindsdb/integrations/handlers/newsapi_handler/tests/test_newsapi_handler.py +4 -4
- mindsdb/integrations/handlers/nuo_jdbc_handler/connection_args.py +2 -2
- mindsdb/integrations/handlers/nuo_jdbc_handler/nuo_jdbc_handler.py +28 -36
- mindsdb/integrations/handlers/nuo_jdbc_handler/tests/test_nuo_handler.py +5 -5
- mindsdb/integrations/handlers/oceanbase_handler/oceanbase_handler.py +0 -1
- mindsdb/integrations/handlers/oceanbase_handler/tests/test_oceanbase_handler.py +8 -10
- mindsdb/integrations/handlers/ollama_handler/ollama_handler.py +3 -3
- mindsdb/integrations/handlers/opengauss_handler/tests/test_opengauss_handler.py +1 -2
- mindsdb/integrations/handlers/openstreetmap_handler/__init__.py +7 -7
- mindsdb/integrations/handlers/oracle_handler/connection_args.py +6 -0
- mindsdb/integrations/handlers/oracle_handler/oracle_handler.py +77 -11
- mindsdb/integrations/handlers/orioledb_handler/tests/test_orioledb_handler.py +8 -10
- mindsdb/integrations/handlers/palm_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/palm_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/palm_handler/palm_handler.py +1 -3
- mindsdb/integrations/handlers/paypal_handler/paypal_handler.py +2 -2
- mindsdb/integrations/handlers/paypal_handler/paypal_tables.py +15 -14
- mindsdb/integrations/handlers/pgvector_handler/pgvector_handler.py +53 -10
- mindsdb/integrations/handlers/phoenix_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/phoenix_handler/phoenix_handler.py +1 -0
- mindsdb/integrations/handlers/pinot_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/pinot_handler/pinot_handler.py +3 -2
- mindsdb/integrations/handlers/plaid_handler/plaid_handler.py +13 -13
- mindsdb/integrations/handlers/plaid_handler/plaid_tables.py +10 -12
- mindsdb/integrations/handlers/plaid_handler/utils.py +4 -6
- mindsdb/integrations/handlers/planetscale_handler/planetscale_handler.py +1 -4
- mindsdb/integrations/handlers/portkey_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/postgres_handler/postgres_handler.py +105 -24
- mindsdb/integrations/handlers/postgres_handler/tests/test_postgres_handler.py +11 -6
- mindsdb/integrations/handlers/questdb_handler/questdb_handler.py +1 -2
- mindsdb/integrations/handlers/questdb_handler/tests/test_questdb_handler.py +2 -3
- mindsdb/integrations/handlers/quickbooks_handler/quickbooks_handler.py +6 -8
- mindsdb/integrations/handlers/quickbooks_handler/quickbooks_table.py +10 -10
- mindsdb/integrations/handlers/rag_handler/ingest.py +2 -2
- mindsdb/integrations/handlers/rag_handler/rag_handler.py +1 -1
- mindsdb/integrations/handlers/rag_handler/settings.py +1 -1
- mindsdb/integrations/handlers/reddit_handler/reddit_handler.py +2 -7
- mindsdb/integrations/handlers/reddit_handler/reddit_tables.py +2 -3
- mindsdb/integrations/handlers/replicate_handler/replicate_handler.py +6 -6
- mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_handler.py +1 -2
- mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_tables.py +0 -3
- mindsdb/integrations/handlers/rockset_handler/connection_args.py +14 -14
- mindsdb/integrations/handlers/rockset_handler/tests/test_rockset_handler.py +1 -0
- mindsdb/integrations/handlers/scylla_handler/scylla_handler.py +6 -5
- mindsdb/integrations/handlers/sendinblue_handler/sendinblue_handler.py +2 -1
- mindsdb/integrations/handlers/sendinblue_handler/sendinblue_tables.py +16 -16
- mindsdb/integrations/handlers/sentence_transformers_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/sheets_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/shopify_handler/shopify_handler.py +7 -6
- mindsdb/integrations/handlers/shopify_handler/shopify_tables.py +38 -41
- mindsdb/integrations/handlers/singlestore_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/singlestore_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/singlestore_handler/singlestore_handler.py +1 -0
- mindsdb/integrations/handlers/singlestore_handler/tests/test_singlestore_handler.py +3 -3
- mindsdb/integrations/handlers/slack_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/snowflake_handler/snowflake_handler.py +100 -6
- mindsdb/integrations/handlers/solr_handler/connection_args.py +7 -7
- mindsdb/integrations/handlers/solr_handler/solr_handler.py +2 -1
- mindsdb/integrations/handlers/solr_handler/tests/test_solr_handler.py +2 -1
- mindsdb/integrations/handlers/sqlany_handler/sqlany_handler.py +3 -2
- mindsdb/integrations/handlers/sqlite_handler/sqlite_handler.py +1 -0
- mindsdb/integrations/handlers/sqreamdb_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/sqreamdb_handler/sqreamdb_handler.py +15 -20
- mindsdb/integrations/handlers/sqreamdb_handler/tests/test_sqreamdb_handler.py +4 -4
- mindsdb/integrations/handlers/stabilityai_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/starrocks_handler/starrocks_handler.py +0 -1
- mindsdb/integrations/handlers/starrocks_handler/tests/test_starrocks_handler.py +8 -10
- mindsdb/integrations/handlers/statsforecast_handler/statsforecast_handler.py +2 -2
- mindsdb/integrations/handlers/strava_handler/strava_handler.py +4 -8
- mindsdb/integrations/handlers/strava_handler/strava_tables.py +22 -30
- mindsdb/integrations/handlers/stripe_handler/stripe_handler.py +3 -2
- mindsdb/integrations/handlers/stripe_handler/stripe_tables.py +11 -27
- mindsdb/integrations/handlers/supabase_handler/tests/test_supabase_handler.py +1 -1
- mindsdb/integrations/handlers/surrealdb_handler/surrealdb_handler.py +4 -4
- mindsdb/integrations/handlers/tdengine_handler/tdengine_handler.py +25 -27
- mindsdb/integrations/handlers/tdengine_handler/tests/test_tdengine_handler.py +8 -8
- mindsdb/integrations/handlers/tidb_handler/tests/test_tidb_handler.py +1 -2
- mindsdb/integrations/handlers/timegpt_handler/timegpt_handler.py +5 -5
- mindsdb/integrations/handlers/tpot_handler/tpot_handler.py +21 -26
- mindsdb/integrations/handlers/trino_handler/trino_handler.py +14 -14
- mindsdb/integrations/handlers/twitter_handler/twitter_handler.py +2 -4
- mindsdb/integrations/handlers/unify_handler/tests/test_unify_handler.py +7 -8
- mindsdb/integrations/handlers/unify_handler/unify_handler.py +9 -9
- mindsdb/integrations/handlers/vertex_handler/vertex_client.py +1 -1
- mindsdb/integrations/handlers/vertica_handler/tests/test_vertica_handler.py +11 -11
- mindsdb/integrations/handlers/vertica_handler/vertica_handler.py +11 -14
- mindsdb/integrations/handlers/vitess_handler/tests/test_vitess_handler.py +9 -11
- mindsdb/integrations/handlers/vitess_handler/vitess_handler.py +0 -1
- mindsdb/integrations/handlers/web_handler/web_handler.py +1 -0
- mindsdb/integrations/handlers/whatsapp_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/writer_handler/evaluate.py +1 -1
- mindsdb/integrations/handlers/writer_handler/settings.py +0 -1
- mindsdb/integrations/handlers/writer_handler/writer_handler.py +1 -0
- mindsdb/integrations/handlers/youtube_handler/youtube_handler.py +5 -5
- mindsdb/integrations/handlers/youtube_handler/youtube_tables.py +26 -27
- mindsdb/integrations/handlers/yugabyte_handler/tests/test_yugabyte_handler.py +3 -3
- mindsdb/integrations/handlers/yugabyte_handler/yugabyte_handler.py +0 -6
- mindsdb/integrations/libs/response.py +67 -52
- mindsdb/integrations/libs/vectordatabase_handler.py +6 -0
- mindsdb/integrations/utilities/handler_utils.py +15 -3
- mindsdb/integrations/utilities/handlers/api_utilities/__init__.py +0 -1
- mindsdb/integrations/utilities/handlers/auth_utilities/__init__.py +0 -2
- mindsdb/integrations/utilities/utils.py +3 -3
- mindsdb/interfaces/agents/agents_controller.py +164 -1
- mindsdb/interfaces/agents/constants.py +15 -0
- mindsdb/interfaces/agents/langchain_agent.py +16 -4
- mindsdb/interfaces/agents/mindsdb_database_agent.py +101 -2
- mindsdb/interfaces/knowledge_base/controller.py +25 -0
- mindsdb/interfaces/knowledge_base/preprocessing/document_preprocessor.py +13 -10
- mindsdb/interfaces/knowledge_base/preprocessing/json_chunker.py +434 -0
- mindsdb/interfaces/knowledge_base/preprocessing/models.py +54 -0
- mindsdb/interfaces/query_context/context_controller.py +66 -10
- mindsdb/interfaces/skills/custom/text2sql/mindsdb_kb_tools.py +190 -0
- mindsdb/interfaces/skills/custom/text2sql/mindsdb_sql_toolkit.py +92 -0
- mindsdb/interfaces/skills/skill_tool.py +202 -57
- mindsdb/interfaces/skills/sql_agent.py +205 -17
- mindsdb/interfaces/storage/fs.py +1 -0
- mindsdb/interfaces/variables/__init__.py +0 -0
- mindsdb/interfaces/variables/variables_controller.py +97 -0
- mindsdb/migrations/env.py +5 -7
- mindsdb/migrations/migrate.py +47 -7
- mindsdb/migrations/versions/2025-05-21_9f150e4f9a05_checkpoint_1.py +360 -0
- mindsdb/utilities/config.py +331 -219
- mindsdb/utilities/starters.py +13 -0
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/METADATA +641 -695
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/RECORD +309 -288
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/WHEEL +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/requirements.txt +0 -1
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/licenses/LICENSE +0 -0
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/top_level.txt +0 -0
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import psutil
|
|
2
2
|
import pandas
|
|
3
3
|
from pandas import DataFrame
|
|
4
|
+
from pandas.api import types as pd_types
|
|
4
5
|
from snowflake.sqlalchemy import snowdialect
|
|
5
6
|
from snowflake import connector
|
|
6
7
|
from snowflake.connector.errors import NotSupportedError
|
|
8
|
+
from snowflake.connector.cursor import SnowflakeCursor, ResultMetadata
|
|
7
9
|
|
|
8
|
-
from mindsdb.utilities import log
|
|
9
10
|
from mindsdb_sql_parser.ast.base import ASTNode
|
|
10
11
|
from mindsdb_sql_parser.ast import Select, Identifier
|
|
11
12
|
|
|
13
|
+
from mindsdb.utilities import log
|
|
12
14
|
from mindsdb.integrations.libs.base import DatabaseHandler
|
|
13
15
|
from mindsdb.utilities.render.sqlalchemy_render import SqlalchemyRender
|
|
14
16
|
from mindsdb.integrations.libs.response import (
|
|
@@ -61,10 +63,105 @@ def _map_type(internal_type_name: str) -> MYSQL_DATA_TYPE:
|
|
|
61
63
|
if internal_type_name in db_types_list:
|
|
62
64
|
return mysql_data_type
|
|
63
65
|
|
|
64
|
-
logger.
|
|
66
|
+
logger.debug(f"Snowflake handler type mapping: unknown type: {internal_type_name}, use VARCHAR as fallback.")
|
|
65
67
|
return MYSQL_DATA_TYPE.VARCHAR
|
|
66
68
|
|
|
67
69
|
|
|
70
|
+
def _make_table_response(result: DataFrame, cursor: SnowflakeCursor) -> Response:
|
|
71
|
+
"""Build response from result and cursor.
|
|
72
|
+
NOTE: Snowflake return only 'general' type in description, so look on result's
|
|
73
|
+
DF types and use types from description only if DF type is 'object'
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
result (DataFrame): result of the query.
|
|
77
|
+
cursor (SnowflakeCursor): cursor object.
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
Response: response object.
|
|
81
|
+
"""
|
|
82
|
+
description: list[ResultMetadata] = cursor.description
|
|
83
|
+
mysql_types: list[MYSQL_DATA_TYPE] = []
|
|
84
|
+
for column in description:
|
|
85
|
+
column_dtype = result[column.name].dtype
|
|
86
|
+
description_column_type = connector.constants.FIELD_ID_TO_NAME.get(column.type_code)
|
|
87
|
+
if pd_types.is_integer_dtype(column_dtype):
|
|
88
|
+
column_dtype_name = column_dtype.name
|
|
89
|
+
if column_dtype_name in ('int8', 'Int8'):
|
|
90
|
+
mysql_types.append(MYSQL_DATA_TYPE.TINYINT)
|
|
91
|
+
elif column_dtype in ('int16', 'Int16'):
|
|
92
|
+
mysql_types.append(MYSQL_DATA_TYPE.SMALLINT)
|
|
93
|
+
elif column_dtype in ('int32', 'Int32'):
|
|
94
|
+
mysql_types.append(MYSQL_DATA_TYPE.MEDIUMINT)
|
|
95
|
+
elif column_dtype in ('int64', 'Int64'):
|
|
96
|
+
mysql_types.append(MYSQL_DATA_TYPE.BIGINT)
|
|
97
|
+
else:
|
|
98
|
+
mysql_types.append(MYSQL_DATA_TYPE.INT)
|
|
99
|
+
continue
|
|
100
|
+
if pd_types.is_float_dtype(column_dtype):
|
|
101
|
+
column_dtype_name = column_dtype.name
|
|
102
|
+
if column_dtype_name in ('float16', 'Float16'): # Float16 does not exists so far
|
|
103
|
+
mysql_types.append(MYSQL_DATA_TYPE.FLOAT)
|
|
104
|
+
elif column_dtype_name in ('float32', 'Float32'):
|
|
105
|
+
mysql_types.append(MYSQL_DATA_TYPE.FLOAT)
|
|
106
|
+
elif column_dtype_name in ('float64', 'Float64'):
|
|
107
|
+
mysql_types.append(MYSQL_DATA_TYPE.DOUBLE)
|
|
108
|
+
else:
|
|
109
|
+
mysql_types.append(MYSQL_DATA_TYPE.FLOAT)
|
|
110
|
+
continue
|
|
111
|
+
if pd_types.is_bool_dtype(column_dtype):
|
|
112
|
+
mysql_types.append(MYSQL_DATA_TYPE.BOOLEAN)
|
|
113
|
+
continue
|
|
114
|
+
if pd_types.is_datetime64_any_dtype(column_dtype):
|
|
115
|
+
mysql_types.append(MYSQL_DATA_TYPE.DATETIME)
|
|
116
|
+
series = result[column.name]
|
|
117
|
+
# snowflake use pytz.timezone
|
|
118
|
+
if series.dt.tz is not None and getattr(series.dt.tz, 'zone', 'UTC') != 'UTC':
|
|
119
|
+
series = series.dt.tz_convert('UTC')
|
|
120
|
+
result[column.name] = series.dt.tz_localize(None)
|
|
121
|
+
continue
|
|
122
|
+
|
|
123
|
+
if pd_types.is_object_dtype(column_dtype):
|
|
124
|
+
if description_column_type == 'TEXT':
|
|
125
|
+
# we can also check column.internal_size, if == 16777216 then it is TEXT, else VARCHAR(internal_size)
|
|
126
|
+
mysql_types.append(MYSQL_DATA_TYPE.TEXT)
|
|
127
|
+
continue
|
|
128
|
+
elif description_column_type == 'BINARY':
|
|
129
|
+
# if column.internal_size == 8388608 then BINARY, else VARBINARY(internal_size)
|
|
130
|
+
mysql_types.append(MYSQL_DATA_TYPE.BINARY)
|
|
131
|
+
continue
|
|
132
|
+
elif description_column_type == 'DATE':
|
|
133
|
+
mysql_types.append(MYSQL_DATA_TYPE.DATE)
|
|
134
|
+
continue
|
|
135
|
+
elif description_column_type == 'TIME':
|
|
136
|
+
mysql_types.append(MYSQL_DATA_TYPE.TIME)
|
|
137
|
+
continue
|
|
138
|
+
|
|
139
|
+
if description_column_type == 'FIXED':
|
|
140
|
+
if column.scale == 0:
|
|
141
|
+
mysql_types.append(MYSQL_DATA_TYPE.INT)
|
|
142
|
+
else:
|
|
143
|
+
# It is NUMBER, DECIMAL or NUMERIC with scale > 0
|
|
144
|
+
mysql_types.append(MYSQL_DATA_TYPE.FLOAT)
|
|
145
|
+
continue
|
|
146
|
+
elif description_column_type == 'REAL':
|
|
147
|
+
mysql_types.append(MYSQL_DATA_TYPE.FLOAT)
|
|
148
|
+
continue
|
|
149
|
+
|
|
150
|
+
mysql_types.append(MYSQL_DATA_TYPE.TEXT)
|
|
151
|
+
|
|
152
|
+
df = DataFrame(
|
|
153
|
+
result,
|
|
154
|
+
columns=[column.name for column in description],
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
return Response(
|
|
158
|
+
RESPONSE_TYPE.TABLE,
|
|
159
|
+
data_frame=df,
|
|
160
|
+
affected_rows=None,
|
|
161
|
+
mysql_types=mysql_types
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
|
|
68
165
|
class SnowflakeHandler(DatabaseHandler):
|
|
69
166
|
"""
|
|
70
167
|
This handler handles connection and execution of the Snowflake statements.
|
|
@@ -214,10 +311,7 @@ class SnowflakeHandler(DatabaseHandler):
|
|
|
214
311
|
raise MemoryError('Not enought memory')
|
|
215
312
|
# endregion
|
|
216
313
|
if len(batches) > 0:
|
|
217
|
-
response =
|
|
218
|
-
RESPONSE_TYPE.TABLE,
|
|
219
|
-
pandas.concat(batches, ignore_index=True)
|
|
220
|
-
)
|
|
314
|
+
response = _make_table_response(result=pandas.concat(batches, ignore_index=True), cursor=cur)
|
|
221
315
|
else:
|
|
222
316
|
response = Response(
|
|
223
317
|
RESPONSE_TYPE.TABLE,
|
|
@@ -36,11 +36,11 @@ connection_args = OrderedDict(
|
|
|
36
36
|
)
|
|
37
37
|
|
|
38
38
|
connection_args_example = OrderedDict(
|
|
39
|
-
username
|
|
40
|
-
password
|
|
41
|
-
host
|
|
42
|
-
port
|
|
43
|
-
server_path
|
|
44
|
-
collection
|
|
45
|
-
use_ssl
|
|
39
|
+
username="demo_user",
|
|
40
|
+
password="demo_password",
|
|
41
|
+
host="127.0.0.1",
|
|
42
|
+
port=8981,
|
|
43
|
+
server_path="solr",
|
|
44
|
+
collection="gettingstarted",
|
|
45
|
+
use_ssl=False,
|
|
46
46
|
)
|
|
@@ -17,6 +17,7 @@ from mindsdb.integrations.libs.response import (
|
|
|
17
17
|
|
|
18
18
|
logger = log.getLogger(__name__)
|
|
19
19
|
|
|
20
|
+
|
|
20
21
|
class SolrHandler(DatabaseHandler):
|
|
21
22
|
"""
|
|
22
23
|
This handler handles connection and execution of the Solr SQL statements.
|
|
@@ -131,7 +132,7 @@ class SolrHandler(DatabaseHandler):
|
|
|
131
132
|
RESPONSE_TYPE.TABLE,
|
|
132
133
|
pd.DataFrame(
|
|
133
134
|
result,
|
|
134
|
-
columns
|
|
135
|
+
columns=columns
|
|
135
136
|
)
|
|
136
137
|
)
|
|
137
138
|
else:
|
|
@@ -18,6 +18,7 @@ from mindsdb.integrations.libs.response import (
|
|
|
18
18
|
|
|
19
19
|
logger = log.getLogger(__name__)
|
|
20
20
|
|
|
21
|
+
|
|
21
22
|
class SQLAnyHandler(DatabaseHandler):
|
|
22
23
|
"""
|
|
23
24
|
This handler handles connection and execution of the SAP SQL Anywhere statements.
|
|
@@ -61,7 +62,7 @@ class SQLAnyHandler(DatabaseHandler):
|
|
|
61
62
|
self.encryption = "SIMPLE"
|
|
62
63
|
else:
|
|
63
64
|
self.encryption = "NONE"
|
|
64
|
-
|
|
65
|
+
|
|
65
66
|
connection = sqlanydb.connect(
|
|
66
67
|
host=self.host,
|
|
67
68
|
userid=self.userid,
|
|
@@ -160,7 +161,7 @@ class SQLAnyHandler(DatabaseHandler):
|
|
|
160
161
|
List all tables in SAP SQL Anywhere in the current schema
|
|
161
162
|
"""
|
|
162
163
|
|
|
163
|
-
return self.native_query(
|
|
164
|
+
return self.native_query("""
|
|
164
165
|
SELECT USER_NAME(ob.UID) AS SCHEMA_NAME
|
|
165
166
|
, st.TABLE_NAME
|
|
166
167
|
, st.TABLE_TYPE
|
|
@@ -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
|