AlexR2D2 / metabase_duckdb_driver

Metabase DuckDB Driver shipped as 3rd party plugin
Apache License 2.0
72 stars 24 forks source link

No method in multimethod 'date' for dispatch value: [:duckdb :day] #7

Closed igitur closed 1 year ago

igitur commented 1 year ago

image

Using v0.6.1 of the driver and connecting successfully to a DuckDB file. I can see the tables and browse around a bit, but it seems any query that uses a date in the query generates this error:

2022-12-19 15:15:42,020 ERROR middleware.catch-exceptions :: Error processing query: No method in multimethod 'date' for dispatch value: [:duckdb :day]
{:database_id 2,
 :started_at #t "2022-12-19T15:15:41.690399700+02:00[Africa/Harare]",
 :via
 [{:status :failed,
   :class clojure.lang.ExceptionInfo,
   :error "Error compiling :field clause: No method in multimethod 'date' for dispatch value: [:duckdb :day]",
   :stacktrace
   ["--> driver.sql.query_processor$fn__47451.invokeStatic(query_processor.clj:479)"
    "driver.sql.query_processor$fn__47451.invoke(query_processor.clj:448)"
    "driver.sql.query_processor$as.invokeStatic(query_processor.clj:706)"
    "driver.sql.query_processor$as.doInvoke(query_processor.clj:692)"
    "driver.sql.query_processor$fn__47871$fn__47873.invoke(query_processor.clj:763)"
    "driver.sql.query_processor$fn__47871.invokeStatic(query_processor.clj:762)"
    "driver.sql.query_processor$fn__47871.invoke(query_processor.clj:757)"
    "driver.sql.query_processor$apply_top_level_clauses$fn__48136.invoke(query_processor.clj:1028)"
    "driver.sql.query_processor$apply_top_level_clauses.invokeStatic(query_processor.clj:1026)"
    "driver.sql.query_processor$apply_top_level_clauses.invoke(query_processor.clj:1022)"
    "driver.sql.query_processor$apply_clauses.invokeStatic(query_processor.clj:1056)"
    "driver.sql.query_processor$apply_clauses.invoke(query_processor.clj:1046)"
    "driver.sql.query_processor$mbql__GT_honeysql.invokeStatic(query_processor.clj:1075)"
    "driver.sql.query_processor$mbql__GT_honeysql.invoke(query_processor.clj:1070)"
    "driver.sql.query_processor$mbql__GT_native.invokeStatic(query_processor.clj:1084)"
    "driver.sql.query_processor$mbql__GT_native.invoke(query_processor.clj:1080)"
    "driver.sql$fn__85150.invokeStatic(sql.clj:40)"
    "driver.sql$fn__85150.invoke(sql.clj:38)"
    "query_processor.middleware.mbql_to_native$query__GT_native_form.invokeStatic(mbql_to_native.clj:13)"
    "query_processor.middleware.mbql_to_native$query__GT_native_form.invoke(mbql_to_native.clj:8)"
    "query_processor.middleware.mbql_to_native$mbql__GT_native$fn__52474.invoke(mbql_to_native.clj:20)"
    "query_processor$fn__55005$combined_post_process__55010$combined_post_process_STAR___55011.invoke(query_processor.clj:212)"
    "query_processor$fn__55005$combined_pre_process__55006$combined_pre_process_STAR___55007.invoke(query_processor.clj:209)"
    "query_processor.middleware.resolve_database_and_driver$resolve_database_and_driver$fn__53450$fn__53455.invoke(resolve_database_and_driver.clj:35)"
    "driver$do_with_driver.invokeStatic(driver.clj:76)"
    "driver$do_with_driver.invoke(driver.clj:72)"
    "query_processor.middleware.resolve_database_and_driver$resolve_database_and_driver$fn__53450.invoke(resolve_database_and_driver.clj:34)"
    "query_processor.middleware.fetch_source_query$resolve_card_id_source_tables$fn__49450.invoke(fetch_source_query.clj:314)"
    "query_processor.middleware.store$initialize_store$fn__49640$fn__49641.invoke(store.clj:11)"
    "query_processor.store$do_with_store.invokeStatic(store.clj:45)"
    "query_processor.store$do_with_store.invoke(store.clj:39)"
    "query_processor.middleware.store$initialize_store$fn__49640.invoke(store.clj:10)"
    "query_processor.middleware.normalize_query$normalize$fn__53722.invoke(normalize_query.clj:22)"
    "query_processor.middleware.constraints$add_default_userland_constraints$fn__50728.invoke(constraints.clj:53)"
    "query_processor.middleware.process_userland_query$process_userland_query$fn__53661.invoke(process_userland_query.clj:145)"
    "query_processor.middleware.catch_exceptions$catch_exceptions$fn__54033.invoke(catch_exceptions.clj:167)"
    "query_processor.reducible$async_qp$qp_STAR___45482$thunk__45484.invoke(reducible.clj:100)"
    "query_processor.reducible$async_qp$qp_STAR___45482.invoke(reducible.clj:106)"
    "query_processor.reducible$async_qp$qp_STAR___45482.invoke(reducible.clj:91)"
    "query_processor.reducible$sync_qp$qp_STAR___45493.doInvoke(reducible.clj:126)"
    "query_processor$process_userland_query.invokeStatic(query_processor.clj:331)"
    "query_processor$process_userland_query.doInvoke(query_processor.clj:327)"
    "query_processor$fn__55052$process_query_and_save_execution_BANG___55061$fn__55064.invoke(query_processor.clj:342)"
    "query_processor$fn__55052$process_query_and_save_execution_BANG___55061.invoke(query_processor.clj:335)"
    "query_processor$fn__55096$process_query_and_save_with_max_results_constraints_BANG___55105$fn__55108.invoke(query_processor.clj:354)"
    "query_processor$fn__55096$process_query_and_save_with_max_results_constraints_BANG___55105.invoke(query_processor.clj:347)"
    "api.dataset$run_query_async$fn__70403.invoke(dataset.clj:69)"
    "query_processor.streaming$streaming_response_STAR_$fn__40578$fn__40579.invoke(streaming.clj:162)"
    "query_processor.streaming$streaming_response_STAR_$fn__40578.invoke(streaming.clj:161)"
    "async.streaming_response$do_f_STAR_.invokeStatic(streaming_response.clj:65)"
    "async.streaming_response$do_f_STAR_.invoke(streaming_response.clj:63)"
    "async.streaming_response$do_f_async$task__20017.invoke(streaming_response.clj:84)"],

I found a similar issue for the Crate driver at https://github.com/metabase/crate-driver/issues/1 , and it seems it required a driver fix.

igitur commented 1 year ago

Comparing https://github.com/AlexR2D2/metabase_duckdb_driver/blob/main/src/metabase/driver/duckdb.clj to https://github.com/metabase/crate-driver/blob/master/src/metabase/driver/crate.clj , it seems there are still many methods/conversions/whatever missing in the DuckDB driver. The date-specific parts start at https://github.com/metabase/crate-driver/blob/master/src/metabase/driver/crate.clj#L142 .

I'd love to submit a PR, but I have no experience with Clojure and wouldn't even know where to begin to debug this. If you don't have the capacity, I can try, but it will take a while.

igitur commented 1 year ago

Maybe the Sqlite driver is a better base to work from, since the syntax is so similar to DuckDB.

https://github.com/metabase/metabase/blob/master/modules/drivers/sqlite/src/metabase/driver/sqlite.clj

AlexR2D2 commented 1 year ago

Please, check the new version of driver. Added the date processing functions as you proposed. Thanks for issue researching.

igitur commented 1 year ago

Sorry, currently on holiday. Will test and give feedback mid January.

igitur commented 1 year ago

Thanks, this is much better. Appreciate the effort. I think there are a few more issues, but I will investigate more that it's a driver problem and if so, will log new issues.