* fix(api): v2 sample endpoint returns 500 for materialized BQ tables
build_sample in app/api/v2_sample.py checked only source_type ==
'bigquery' before routing to _fetch_bq_sample, so materialized
tables (source_type='bigquery', query_mode='materialized') attempted
a live BigQuery query for data that lives locally as parquet —
causing an unhandled exception and HTTP 500.
Fix mirrors the existing guard already in v2_schema.py (#261): skip
_fetch_bq_sample when query_mode='materialized' and fall through to
the local parquet read path. The parquet is the source of truth for
any materialized source regardless of source_type.
Regression test test_materialized_bq_table_reads_parquet_not_bq
patches _fetch_bq_sample with a sentinel, registers a materialized
BQ table, calls build_sample, and asserts (a) the sentinel was never
hit and (b) rows came from the local parquet.
Credit @davidrybar-grpn (#341, cleaned + rebased onto post-#340 main).
* release: 0.54.28 — v2 sample endpoint materialized-BQ 500 fix
---------
Co-authored-by: ZdenekSrotyr <zdenek.srotyr@keboola.com>