Skip to main content

connectorx/transports/
bigquery_arrow.rs

1//! Transport from BigQuery Source to Arrow Destination.
2
3use crate::{
4    destinations::arrow::{
5        typesystem::{
6            ArrowTypeSystem, DateTimeWrapperMicro, NaiveDateTimeWrapperMicro, NaiveTimeWrapperMicro,
7        },
8        ArrowDestination, ArrowDestinationError,
9    },
10    impl_transport,
11    sources::bigquery::{BigQuerySource, BigQuerySourceError, BigQueryTypeSystem},
12    typesystem::TypeConversion,
13};
14use chrono::{DateTime, NaiveDate, NaiveDateTime, NaiveTime, Utc};
15use thiserror::Error;
16
17#[derive(Error, Debug)]
18pub enum BigQueryArrowTransportError {
19    #[error(transparent)]
20    Source(#[from] BigQuerySourceError),
21
22    #[error(transparent)]
23    Destination(#[from] ArrowDestinationError),
24
25    #[error(transparent)]
26    ConnectorX(#[from] crate::errors::ConnectorXError),
27}
28
29/// Convert BigQuery data types to Arrow data types.
30pub struct BigQueryArrowTransport;
31
32impl_transport!(
33    name = BigQueryArrowTransport,
34    error = BigQueryArrowTransportError,
35    systems = BigQueryTypeSystem => ArrowTypeSystem,
36    route = BigQuerySource => ArrowDestination,
37    mappings = {
38        { Bool[bool]                 => Boolean[bool]             | conversion auto }
39        { Boolean[bool]              => Boolean[bool]             | conversion none }
40        { Int64[i64]                 => Int64[i64]                | conversion auto }
41        { Integer[i64]               => Int64[i64]                | conversion none }
42        { Float64[f64]               => Float64[f64]              | conversion auto }
43        { Float[f64]                 => Float64[f64]              | conversion none }
44        { Numeric[f64]               => Float64[f64]              | conversion none }
45        { Bignumeric[f64]            => Float64[f64]              | conversion none }
46        { String[String]             => LargeUtf8[String]         | conversion auto }
47        { Bytes[String]              => LargeUtf8[String]         | conversion none }
48        { Date[NaiveDate]            => Date32[NaiveDate]         | conversion auto }
49        { Datetime[NaiveDateTime]    => Date64Micro[NaiveDateTimeWrapperMicro] | conversion option }
50        { Time[NaiveTime]            => Time64Micro[NaiveTimeWrapperMicro]     | conversion option }
51        { Timestamp[DateTime<Utc>]   => DateTimeTzMicro[DateTimeWrapperMicro]  | conversion option }
52    }
53);
54
55impl TypeConversion<NaiveDateTime, NaiveDateTimeWrapperMicro> for BigQueryArrowTransport {
56    fn convert(val: NaiveDateTime) -> NaiveDateTimeWrapperMicro {
57        NaiveDateTimeWrapperMicro(val)
58    }
59}
60
61impl TypeConversion<NaiveTime, NaiveTimeWrapperMicro> for BigQueryArrowTransport {
62    fn convert(val: NaiveTime) -> NaiveTimeWrapperMicro {
63        NaiveTimeWrapperMicro(val)
64    }
65}
66
67impl TypeConversion<DateTime<Utc>, DateTimeWrapperMicro> for BigQueryArrowTransport {
68    fn convert(val: DateTime<Utc>) -> DateTimeWrapperMicro {
69        DateTimeWrapperMicro(val)
70    }
71}