From 4ebea8c7c543756dd4164c576b2e3dd9cda6bc61 Mon Sep 17 00:00:00 2001 From: Pavel Tiunov Date: Tue, 26 Sep 2023 13:06:43 -0700 Subject: [PATCH] BigQuery fixes --- .../src/adapter/BigqueryQuery.js | 2 +- .../cubesql/src/compile/engine/df/scan.rs | 28 ++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/packages/cubejs-schema-compiler/src/adapter/BigqueryQuery.js b/packages/cubejs-schema-compiler/src/adapter/BigqueryQuery.js index b1711620fbb5f..65be56714e717 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BigqueryQuery.js +++ b/packages/cubejs-schema-compiler/src/adapter/BigqueryQuery.js @@ -152,7 +152,7 @@ export class BigqueryQuery extends BaseQuery { templates.functions.DATETRUNC = 'DATETIME_TRUNC(CAST({{ args[1] }} AS DATETIME), {{ date_part }})'; templates.expressions.binary = '{% if op == \'%\' %}MOD({{ left }}, {{ right }}){% else %}({{ left }} {{ op }} {{ right }}){% endif %}'; templates.expressions.interval = 'INTERVAL {{ interval }}'; - templates.expressions.extract = 'EXTRACT({% if date_part == \'DOW\' %}DAYOFWEEK{% else %}{{ date_part }}{% endif %} FROM {{ expr }})'; + templates.expressions.extract = 'EXTRACT({% if date_part == \'DOW\' %}DAYOFWEEK{% elif date_part == \'DOY\' %}DAYOFYEAR{% else %}{{ date_part }}{% endif %} FROM {{ expr }})'; return templates; } } diff --git a/rust/cubesql/cubesql/src/compile/engine/df/scan.rs b/rust/cubesql/cubesql/src/compile/engine/df/scan.rs index a361f5df51d54..3e3c58aefa8fa 100644 --- a/rust/cubesql/cubesql/src/compile/engine/df/scan.rs +++ b/rust/cubesql/cubesql/src/compile/engine/df/scan.rs @@ -10,7 +10,8 @@ use cubeclient::models::{V1LoadRequestQuery, V1LoadResult, V1LoadResultAnnotatio pub use datafusion::{ arrow::{ array::{ - ArrayRef, BooleanBuilder, Date32Builder, Float64Builder, Int64Builder, StringBuilder, + ArrayRef, BooleanBuilder, Date32Builder, Float64Builder, Int32Builder, Int64Builder, + StringBuilder, }, datatypes::{DataType, SchemaRef}, error::{ArrowError, Result as ArrowResult}, @@ -896,6 +897,31 @@ pub fn transform_response( } ) } + DataType::Int32 => { + build_column!( + DataType::Int32, + Int32Builder, + response, + field_name, + { + (FieldValue::Number(number), builder) => builder.append_value(number.round() as i32)?, + (FieldValue::String(s), builder) => match s.parse::() { + Ok(v) => builder.append_value(v)?, + Err(error) => { + warn!( + "Unable to parse value as i32: {}", + error.to_string() + ); + + builder.append_null()? + } + }, + }, + { + (ScalarValue::Int32(v), builder) => builder.append_option(v.clone())?, + } + ) + } DataType::Int64 => { build_column!( DataType::Int64,