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
|
@@ -50,7 +50,7 @@ class LlamaIndexHandler(BaseMLEngine):
|
|
|
50
50
|
# workaround to create llama model without input data
|
|
51
51
|
if df is None or df.empty:
|
|
52
52
|
df = pd.DataFrame([{"text": ""}])
|
|
53
|
-
|
|
53
|
+
|
|
54
54
|
args_reader = args.get("using", {}).get("reader", self.default_reader)
|
|
55
55
|
|
|
56
56
|
if args_reader == "DFReader":
|
|
@@ -138,7 +138,7 @@ class LlamaIndexHandler(BaseMLEngine):
|
|
|
138
138
|
|
|
139
139
|
if input_column is None:
|
|
140
140
|
raise Exception(
|
|
141
|
-
|
|
141
|
+
"`input_column` must be provided at model creation time or through USING clause when predicting. Please try again."
|
|
142
142
|
) # noqa
|
|
143
143
|
|
|
144
144
|
if input_column not in df.columns:
|
|
@@ -151,7 +151,7 @@ class LlamaIndexHandler(BaseMLEngine):
|
|
|
151
151
|
index_path = self.model_storage.folder_get("context")
|
|
152
152
|
storage_context = StorageContext.from_defaults(persist_dir=index_path)
|
|
153
153
|
self._get_service_context()
|
|
154
|
-
|
|
154
|
+
|
|
155
155
|
index = load_index_from_storage(
|
|
156
156
|
storage_context
|
|
157
157
|
)
|
|
@@ -182,7 +182,7 @@ class LlamaIndexHandler(BaseMLEngine):
|
|
|
182
182
|
llm_kwargs["model_name"] = args["using"]["model_name"]
|
|
183
183
|
if "max_tokens" in args["using"]:
|
|
184
184
|
llm_kwargs["max_tokens"] = args["using"]["max_tokens"]
|
|
185
|
-
#only way this works is by sending the key through openai
|
|
185
|
+
# only way this works is by sending the key through openai
|
|
186
186
|
|
|
187
187
|
openai.api_key = openai_api_key
|
|
188
188
|
if Settings.llm is None:
|
|
@@ -2,6 +2,7 @@ from typing import List, Optional
|
|
|
2
2
|
from pydantic import BaseModel, field_validator, model_validator
|
|
3
3
|
from pydantic_settings import BaseSettings
|
|
4
4
|
|
|
5
|
+
|
|
5
6
|
class LlamaIndexConfig(BaseSettings):
|
|
6
7
|
"""
|
|
7
8
|
Model for LlamaIndexHandler settings.
|
|
@@ -12,14 +13,15 @@ class LlamaIndexConfig(BaseSettings):
|
|
|
12
13
|
default_reader (str): Default reader. Note this is custom data frame reader.
|
|
13
14
|
supported_reader (List[str]): Supported readers.
|
|
14
15
|
"""
|
|
15
|
-
DEFAULT_INDEX_CLASS
|
|
16
|
-
SUPPORTED_INDEXES
|
|
16
|
+
DEFAULT_INDEX_CLASS: str = "VectorStoreIndex"
|
|
17
|
+
SUPPORTED_INDEXES: List[str] = ["VectorStoreIndex"]
|
|
17
18
|
DEFAULT_READER: str = "DFReader"
|
|
18
|
-
SUPPORTED_READERS
|
|
19
|
+
SUPPORTED_READERS: List[str] = ["DFReader", "SimpleWebPageReader"]
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
llama_index_config = LlamaIndexConfig()
|
|
22
23
|
|
|
24
|
+
|
|
23
25
|
class LlamaIndexModel(BaseModel):
|
|
24
26
|
"""
|
|
25
27
|
Model for LlamaIndexHandler.
|
|
@@ -45,7 +47,7 @@ class LlamaIndexModel(BaseModel):
|
|
|
45
47
|
def validate_reader(cls, value):
|
|
46
48
|
if value not in llama_index_config.SUPPORTED_READERS:
|
|
47
49
|
raise ValueError(f"Reader {value} is not supported.")
|
|
48
|
-
|
|
50
|
+
|
|
49
51
|
return value
|
|
50
52
|
|
|
51
53
|
@field_validator('index_class')
|
|
@@ -53,13 +55,12 @@ class LlamaIndexModel(BaseModel):
|
|
|
53
55
|
def validate_index_class(cls, value):
|
|
54
56
|
if value not in llama_index_config.SUPPORTED_INDEXES:
|
|
55
57
|
raise ValueError(f"Index class {value} is not supported.")
|
|
56
|
-
|
|
58
|
+
|
|
57
59
|
return value
|
|
58
|
-
|
|
60
|
+
|
|
59
61
|
@model_validator(mode='after')
|
|
60
62
|
def validate_mode(self):
|
|
61
63
|
if self.mode == "conversational" and not all([self.user_column, self.assistant_column]):
|
|
62
|
-
raise ValueError(
|
|
63
|
-
|
|
64
|
-
return self
|
|
64
|
+
raise ValueError("Conversational mode requires user_column and assistant_column parameter")
|
|
65
65
|
|
|
66
|
+
return self
|
|
@@ -2,6 +2,7 @@ import unittest
|
|
|
2
2
|
from mindsdb.integrations.handlers.materialize_handler.materialize_handler import MaterializeHandler
|
|
3
3
|
from mindsdb.integrations.libs.response import RESPONSE_TYPE
|
|
4
4
|
|
|
5
|
+
|
|
5
6
|
class materializeHandlerTest(unittest.TestCase):
|
|
6
7
|
@classmethod
|
|
7
8
|
def setUpClass(cls):
|
|
@@ -21,36 +22,33 @@ class materializeHandlerTest(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
|
-
|
|
@@ -18,6 +18,7 @@ from mindsdb.integrations.libs.response import (
|
|
|
18
18
|
|
|
19
19
|
logger = log.getLogger(__name__)
|
|
20
20
|
|
|
21
|
+
|
|
21
22
|
class MatrixOneHandler(DatabaseHandler):
|
|
22
23
|
"""
|
|
23
24
|
This handler handles connection and execution of the MatrixOne statements.
|
|
@@ -25,7 +26,7 @@ class MatrixOneHandler(DatabaseHandler):
|
|
|
25
26
|
|
|
26
27
|
name = 'matrixone'
|
|
27
28
|
|
|
28
|
-
def __init__(self, name,connection_data: Optional[dict], **kwargs):
|
|
29
|
+
def __init__(self, name, connection_data: Optional[dict], **kwargs):
|
|
29
30
|
super().__init__(name)
|
|
30
31
|
self.mysql_url = None
|
|
31
32
|
self.parser = parse_sql
|
|
@@ -158,11 +159,10 @@ class MatrixOneHandler(DatabaseHandler):
|
|
|
158
159
|
"""
|
|
159
160
|
q = f"SHOW COLUMNS FROM {table_name};"
|
|
160
161
|
result = self.native_query(q)
|
|
161
|
-
df=result.data_frame
|
|
162
|
-
result.data_frame=df.rename(columns={
|
|
162
|
+
df = result.data_frame
|
|
163
|
+
result.data_frame = df.rename(columns={
|
|
163
164
|
df.columns[0]: 'COLUMN_NAME',
|
|
164
165
|
df.columns[1]: 'DATA TYPE'
|
|
165
166
|
})
|
|
166
167
|
|
|
167
|
-
|
|
168
168
|
return result
|
|
@@ -19,38 +19,37 @@ class MatrixOneHandlerTest(unittest.TestCase):
|
|
|
19
19
|
}
|
|
20
20
|
cls.handler = MatrixOneHandler('test_mysql_handler', cls.kwargs)
|
|
21
21
|
|
|
22
|
-
|
|
23
22
|
def test_0_connect(self):
|
|
24
23
|
self.handler.connect()
|
|
25
24
|
|
|
26
25
|
def test_1_drop_table(self):
|
|
27
26
|
res = self.handler.query("DROP TABLE IF EXISTS PREM;")
|
|
28
|
-
assert res.type is
|
|
27
|
+
assert res.type is not RESPONSE_TYPE.ERROR
|
|
29
28
|
|
|
30
29
|
def test_2_create_table(self):
|
|
31
30
|
res = self.handler.query("CREATE TABLE IF NOT EXISTS PREM (Premi varchar(50));")
|
|
32
|
-
assert res.type is not
|
|
31
|
+
assert res.type is not RESPONSE_TYPE.ERROR
|
|
33
32
|
|
|
34
33
|
def test_3_insert_table(self):
|
|
35
34
|
res = self.handler.query("INSERT INTO PREM VALUES('Radha <3 Krishna');")
|
|
36
|
-
assert res.type is not
|
|
35
|
+
assert res.type is not RESPONSE_TYPE.ERROR
|
|
37
36
|
|
|
38
37
|
def test_4_get_tables(self):
|
|
39
38
|
tables = self.handler.get_tables()
|
|
40
|
-
assert tables.type is not
|
|
39
|
+
assert tables.type is not RESPONSE_TYPE.ERROR
|
|
41
40
|
|
|
42
41
|
def test_5_select_query(self):
|
|
43
42
|
query = "SELECT * FROM PREM;"
|
|
44
43
|
result = self.handler.native_query(query)
|
|
45
|
-
assert result.type is not
|
|
46
|
-
|
|
44
|
+
assert result.type is not RESPONSE_TYPE.ERROR
|
|
45
|
+
|
|
47
46
|
def test_6_get_columns(self):
|
|
48
47
|
result = self.handler.get_columns('PREM')
|
|
49
|
-
assert result.type is not
|
|
48
|
+
assert result.type is not RESPONSE_TYPE.ERROR
|
|
50
49
|
|
|
51
50
|
def test_7_check_connection(self):
|
|
52
51
|
self.handler.check_connection()
|
|
53
52
|
|
|
54
53
|
|
|
55
54
|
if __name__ == '__main__':
|
|
56
|
-
unittest.main()
|
|
55
|
+
unittest.main()
|
|
@@ -4,31 +4,31 @@ from mindsdb.integrations.libs.const import HANDLER_CONNECTION_ARG_TYPE as ARG_T
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
connection_args = OrderedDict(
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
7
|
+
host={
|
|
8
|
+
'type': ARG_TYPE.STR,
|
|
9
|
+
'description': 'The host name or IP address of the SAP MaxDB server.'
|
|
10
|
+
},
|
|
11
|
+
port={
|
|
12
|
+
'type': ARG_TYPE.INT,
|
|
13
|
+
'description': 'The TCP/IP port of the SAP MaxDB. Must be an integer.'
|
|
14
|
+
},
|
|
15
|
+
database={
|
|
16
|
+
'type': ARG_TYPE.STR,
|
|
17
|
+
'description': 'The database name to use when connecting with the SAP MaxDB server.'
|
|
18
|
+
},
|
|
19
|
+
jdbc_location={
|
|
20
|
+
'type': ARG_TYPE.STR,
|
|
21
|
+
'description': 'The location of the jar file which contains the JDBC class.'
|
|
22
|
+
},
|
|
23
|
+
user={
|
|
24
|
+
'type': ARG_TYPE.STR,
|
|
25
|
+
'description': 'The user name used to authenticate with the SAP MaxDB server.'
|
|
26
|
+
},
|
|
27
|
+
password={
|
|
28
|
+
'type': ARG_TYPE.PWD,
|
|
29
|
+
'description': 'The password to authenticate the user with the SAP MaxDB server.',
|
|
30
|
+
'secret': True
|
|
31
|
+
}
|
|
32
32
|
)
|
|
33
33
|
|
|
34
34
|
|
|
@@ -11,6 +11,7 @@ from mindsdb_sql_parser import parse_sql
|
|
|
11
11
|
|
|
12
12
|
logger = log.getLogger(__name__)
|
|
13
13
|
|
|
14
|
+
|
|
14
15
|
class MediaWikiHandler(APIHandler):
|
|
15
16
|
"""
|
|
16
17
|
The MediaWiki handler implementation.
|
|
@@ -65,7 +66,7 @@ class MediaWikiHandler(APIHandler):
|
|
|
65
66
|
self.connect()
|
|
66
67
|
response.success = True
|
|
67
68
|
except Exception as e:
|
|
68
|
-
logger.error(
|
|
69
|
+
logger.error('Error connecting to MediaWiki!')
|
|
69
70
|
response.error_message = str(e)
|
|
70
71
|
|
|
71
72
|
self.is_connected = response.success
|
|
@@ -84,4 +85,4 @@ class MediaWikiHandler(APIHandler):
|
|
|
84
85
|
Request status
|
|
85
86
|
"""
|
|
86
87
|
ast = parse_sql(query)
|
|
87
|
-
return self.query(ast)
|
|
88
|
+
return self.query(ast)
|
|
@@ -11,9 +11,9 @@ except Exception as e:
|
|
|
11
11
|
title = 'Mendeley'
|
|
12
12
|
name = 'mendeley'
|
|
13
13
|
type = HANDLER_TYPE.DATA
|
|
14
|
-
icon_path= 'icon.svg'
|
|
14
|
+
icon_path = 'icon.svg'
|
|
15
15
|
permanent = False
|
|
16
16
|
|
|
17
17
|
__all__ = [
|
|
18
|
-
'Handler', 'version', 'name', 'type', 'title', 'description', 'import_error','icon_path'
|
|
18
|
+
'Handler', 'version', 'name', 'type', 'title', 'description', 'import_error', 'icon_path'
|
|
19
19
|
]
|
|
@@ -1,23 +1,21 @@
|
|
|
1
1
|
from mindsdb_sql_parser import parse_sql
|
|
2
2
|
import pandas as pd
|
|
3
3
|
from mendeley import Mendeley
|
|
4
|
-
from mindsdb.integrations.libs.api_handler import APIHandler
|
|
4
|
+
from mindsdb.integrations.libs.api_handler import APIHandler
|
|
5
5
|
from mendeley.session import MendeleySession
|
|
6
|
-
from mindsdb.integrations.handlers.mendeley_handler.mendeley_tables import CatalogSearchTable
|
|
6
|
+
from mindsdb.integrations.handlers.mendeley_handler.mendeley_tables import CatalogSearchTable
|
|
7
7
|
from mindsdb.utilities import log
|
|
8
8
|
from typing import Dict
|
|
9
9
|
from mindsdb.integrations.libs.response import (
|
|
10
|
-
HandlerStatusResponse as StatusResponse
|
|
11
|
-
HandlerResponse as Response,
|
|
12
|
-
RESPONSE_TYPE
|
|
10
|
+
HandlerStatusResponse as StatusResponse
|
|
13
11
|
)
|
|
14
12
|
|
|
15
13
|
logger = log.getLogger(__name__)
|
|
16
14
|
|
|
17
|
-
class MendeleyHandler(APIHandler):
|
|
18
15
|
|
|
19
|
-
|
|
16
|
+
class MendeleyHandler(APIHandler):
|
|
20
17
|
|
|
18
|
+
def __init__(self, name, **kwargs):
|
|
21
19
|
""" constructor
|
|
22
20
|
Args:
|
|
23
21
|
name (str): the handler name
|
|
@@ -25,16 +23,16 @@ class MendeleyHandler(APIHandler):
|
|
|
25
23
|
super().__init__(name)
|
|
26
24
|
|
|
27
25
|
self.connection_args = kwargs.get('connection_data', {})
|
|
28
|
-
|
|
26
|
+
|
|
29
27
|
self.client_id = self.connection_args.get('client_id', None)
|
|
30
28
|
self.client_secret = self.connection_args.get('client_secret', None)
|
|
31
29
|
self.session = self.connect()
|
|
32
30
|
|
|
33
31
|
self.session = None
|
|
34
32
|
self.is_connected = False
|
|
35
|
-
|
|
33
|
+
|
|
36
34
|
catalog_search_data = CatalogSearchTable(self)
|
|
37
|
-
self.catalog_search_data = catalog_search_data
|
|
35
|
+
self.catalog_search_data = catalog_search_data
|
|
38
36
|
self._register_table('catalog_search_data', catalog_search_data)
|
|
39
37
|
|
|
40
38
|
def connect(self) -> MendeleySession:
|
|
@@ -47,7 +45,7 @@ class MendeleyHandler(APIHandler):
|
|
|
47
45
|
Returns:
|
|
48
46
|
HandlerStatusResponse """
|
|
49
47
|
|
|
50
|
-
if self.is_connected
|
|
48
|
+
if self.is_connected:
|
|
51
49
|
return self.session
|
|
52
50
|
|
|
53
51
|
mendeley = Mendeley(self.client_id, self.client_secret)
|
|
@@ -56,9 +54,8 @@ class MendeleyHandler(APIHandler):
|
|
|
56
54
|
|
|
57
55
|
self.is_connected = True
|
|
58
56
|
return self.session
|
|
59
|
-
|
|
60
|
-
def check_connection(self) -> StatusResponse:
|
|
61
57
|
|
|
58
|
+
def check_connection(self) -> StatusResponse:
|
|
62
59
|
""" The check_connection method checks the connection to the handler
|
|
63
60
|
Returns:
|
|
64
61
|
HandlerStatusResponse
|
|
@@ -77,7 +74,6 @@ class MendeleyHandler(APIHandler):
|
|
|
77
74
|
return response
|
|
78
75
|
|
|
79
76
|
def native_query(self, query_string: str):
|
|
80
|
-
|
|
81
77
|
"""The native_query method receives raw query and acts upon it.
|
|
82
78
|
Args:
|
|
83
79
|
query_string (str): query in native format
|
|
@@ -86,9 +82,9 @@ class MendeleyHandler(APIHandler):
|
|
|
86
82
|
"""
|
|
87
83
|
ast = parse_sql(query_string)
|
|
88
84
|
return self.query(ast)
|
|
89
|
-
|
|
90
|
-
def get_authors(self,data):
|
|
91
|
-
"""The get_authors method receives the data - a specific document returned by the API, gets the names of the authors
|
|
85
|
+
|
|
86
|
+
def get_authors(self, data):
|
|
87
|
+
"""The get_authors method receives the data - a specific document returned by the API, gets the names of the authors
|
|
92
88
|
and combines them in a string, so as to allow the use of DataFrame.
|
|
93
89
|
Args:
|
|
94
90
|
data (CatalogDocument): document returned by API
|
|
@@ -97,18 +93,18 @@ class MendeleyHandler(APIHandler):
|
|
|
97
93
|
"""
|
|
98
94
|
authors = ""
|
|
99
95
|
sum = 0
|
|
100
|
-
if data.authors
|
|
96
|
+
if data.authors is not None:
|
|
101
97
|
for x in data.authors:
|
|
102
|
-
if sum + 1 == len(data.authors) and x.first_name
|
|
98
|
+
if sum + 1 == len(data.authors) and x.first_name is not None and x.last_name is not None:
|
|
103
99
|
authors = authors + x.first_name + " " + x.last_name
|
|
104
100
|
else:
|
|
105
|
-
if x.first_name
|
|
101
|
+
if x.first_name is not None and x.last_name is not None:
|
|
106
102
|
authors = authors + x.first_name + " " + x.last_name + ", "
|
|
107
103
|
sum = sum + 1
|
|
108
104
|
return authors
|
|
109
105
|
|
|
110
|
-
def get_keywords(self,data):
|
|
111
|
-
"""The get_keywords method receives the data-a specific document returned by the API, gets the specified keywords
|
|
106
|
+
def get_keywords(self, data):
|
|
107
|
+
"""The get_keywords method receives the data-a specific document returned by the API, gets the specified keywords
|
|
112
108
|
and combines them in a string, so as to allow the use of DataFrame.
|
|
113
109
|
Args:
|
|
114
110
|
data (CatalogDocument) : document returned by the API
|
|
@@ -117,18 +113,17 @@ class MendeleyHandler(APIHandler):
|
|
|
117
113
|
"""
|
|
118
114
|
keywords = ""
|
|
119
115
|
sum = 0
|
|
120
|
-
if data.keywords
|
|
116
|
+
if data.keywords is not None:
|
|
121
117
|
for x in data.keywords:
|
|
122
118
|
if sum + 1 == len(data.keywords):
|
|
123
|
-
keywords = keywords
|
|
119
|
+
keywords = keywords + x + " "
|
|
124
120
|
else:
|
|
125
|
-
if x
|
|
121
|
+
if x is not None:
|
|
126
122
|
keywords = keywords + x + ", "
|
|
127
123
|
sum = sum + 1
|
|
128
124
|
return keywords
|
|
129
|
-
|
|
130
|
-
def create_dict(self,data):
|
|
131
125
|
|
|
126
|
+
def create_dict(self, data):
|
|
132
127
|
"""The create_dict method receives the data-a specific document returned by the API, gets the resources-fields of the document,
|
|
133
128
|
as specified in Mendley documentation, and puts them in a dictionary.
|
|
134
129
|
|
|
@@ -142,7 +137,7 @@ class MendeleyHandler(APIHandler):
|
|
|
142
137
|
dict["type"] = data.type
|
|
143
138
|
dict["source"] = data.source
|
|
144
139
|
dict["year"] = data.year
|
|
145
|
-
if data.identifiers
|
|
140
|
+
if data.identifiers is not None:
|
|
146
141
|
dict["pmid"] = data.identifiers.get("pmid")
|
|
147
142
|
dict["sgr"] = data.identifiers.get("sgr")
|
|
148
143
|
dict["issn"] = data.identifiers.get("issn")
|
|
@@ -150,16 +145,15 @@ class MendeleyHandler(APIHandler):
|
|
|
150
145
|
dict["doi"] = data.identifiers.get("doi")
|
|
151
146
|
dict["pui"] = data.identifiers.get("pui")
|
|
152
147
|
dict["authors"] = self.get_authors(data)
|
|
153
|
-
if data.keywords
|
|
148
|
+
if data.keywords is not None:
|
|
154
149
|
dict["keywords"] = self.get_keywords(data)
|
|
155
150
|
else:
|
|
156
151
|
dict["keywords"] = None
|
|
157
152
|
dict["link"] = data.link
|
|
158
153
|
dict["id"] = data.id
|
|
159
154
|
return dict
|
|
160
|
-
|
|
155
|
+
|
|
161
156
|
def call_mendeley_api(self, method_name: str, params: Dict) -> pd.DataFrame:
|
|
162
|
-
|
|
163
157
|
"""The method call_mendeley_api is used to communicate with Mendeley. Depending on the method used there are three different types
|
|
164
158
|
of search conducted.
|
|
165
159
|
The advanced_search results in a CatalogSearch resource, which, depending on the parameters used, could either be a number of different documents (CatalogDocument),
|
|
@@ -174,28 +168,28 @@ class MendeleyHandler(APIHandler):
|
|
|
174
168
|
DataFrame
|
|
175
169
|
"""
|
|
176
170
|
|
|
177
|
-
self.session= self.connect()
|
|
171
|
+
self.session = self.connect()
|
|
178
172
|
|
|
179
173
|
if method_name == 'advanced_search':
|
|
180
174
|
search_params = {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
175
|
+
'title': params.get("title"),
|
|
176
|
+
'author': params.get("author"),
|
|
177
|
+
'source': params.get("source"),
|
|
178
|
+
'abstract': params.get("abstract"),
|
|
179
|
+
'min_year': params.get("min_year"),
|
|
180
|
+
'max_year': params.get("max_year"),
|
|
181
|
+
'open_access': params.get("open_access")
|
|
188
182
|
}
|
|
189
183
|
data = self.session.catalog.advanced_search(**search_params)
|
|
190
184
|
sum = 0
|
|
191
185
|
df = pd.DataFrame()
|
|
192
186
|
for x in data.list(page_size=params["limit"]).items:
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
187
|
+
if sum == 0:
|
|
188
|
+
df = pd.DataFrame(self.create_dict(x), index=[0])
|
|
189
|
+
sum += 1
|
|
190
|
+
else:
|
|
191
|
+
df = df.append(self.create_dict(x), ignore_index=True)
|
|
192
|
+
sum += 1
|
|
199
193
|
if df.empty:
|
|
200
194
|
raise NotImplementedError(('Insufficient or wrong input given'))
|
|
201
195
|
else:
|
|
@@ -203,23 +197,21 @@ class MendeleyHandler(APIHandler):
|
|
|
203
197
|
|
|
204
198
|
elif method_name == 'identifier_search':
|
|
205
199
|
search_params = {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
200
|
+
'arxiv': params.get("arxiv"),
|
|
201
|
+
'doi': params.get("doi"),
|
|
202
|
+
'isbn': params.get("isbn"),
|
|
203
|
+
'issn': params.get("issn"),
|
|
204
|
+
'pmid': params.get("pmid"),
|
|
205
|
+
'scopus': params.get("scopus"),
|
|
206
|
+
'filehash': params.get("filehash")
|
|
213
207
|
}
|
|
214
208
|
data = self.session.catalog.by_identifier(**search_params)
|
|
215
|
-
df = pd.DataFrame(self.create_dict(data),index=[0])
|
|
209
|
+
df = pd.DataFrame(self.create_dict(data), index=[0])
|
|
216
210
|
return df
|
|
217
211
|
|
|
218
212
|
elif method_name == 'get':
|
|
219
213
|
data = self.session.catalog.get(params.get("id"))
|
|
220
|
-
df = pd.DataFrame(self.create_dict(data),index=[0])
|
|
214
|
+
df = pd.DataFrame(self.create_dict(data), index=[0])
|
|
221
215
|
return df
|
|
222
216
|
|
|
223
217
|
raise NotImplementedError('Method name {} not supported by Mendeley API Handler'.format(method_name))
|
|
224
|
-
|
|
225
|
-
|