@@ -16,9 +16,11 @@ use crate::{
1616use futures:: future:: join_all;
1717use log:: error;
1818
19- use mockall:: automock;
20-
21- use std:: env;
19+ use std:: {
20+ env,
21+ fmt:: { Debug , Display } ,
22+ str:: FromStr ,
23+ } ;
2224
2325use std:: sync:: Arc ;
2426
@@ -108,15 +110,16 @@ pub struct Config {
108110 injector : Arc < Injector > ,
109111}
110112
111- #[ automock]
112- pub trait ConfigObj : DIService {
113+ pub trait ConfigObj : DIService + Debug {
113114 fn bind_address ( & self ) -> & Option < String > ;
114115
115116 fn postgres_bind_address ( & self ) -> & Option < String > ;
116117
117118 fn query_timeout ( & self ) -> u64 ;
118119
119120 fn nonce ( & self ) -> & Option < Vec < u8 > > ;
121+
122+ fn disable_strict_agg_type_match ( & self ) -> bool ;
120123}
121124
122125#[ derive( Debug , Clone ) ]
@@ -126,10 +129,36 @@ pub struct ConfigObjImpl {
126129 pub nonce : Option < Vec < u8 > > ,
127130 pub query_timeout : u64 ,
128131 pub timezone : Option < String > ,
132+ pub disable_strict_agg_type_match : bool ,
133+ }
134+
135+ impl ConfigObjImpl {
136+ pub fn default ( ) -> Self {
137+ let query_timeout = env:: var ( "CUBESQL_QUERY_TIMEOUT" )
138+ . ok ( )
139+ . map ( |v| v. parse :: < u64 > ( ) . unwrap ( ) )
140+ . unwrap_or ( 120 ) ;
141+ Self {
142+ bind_address : env:: var ( "CUBESQL_BIND_ADDR" ) . ok ( ) . or_else ( || {
143+ env:: var ( "CUBESQL_PORT" )
144+ . ok ( )
145+ . map ( |v| format ! ( "0.0.0.0:{}" , v. parse:: <u16 >( ) . unwrap( ) ) )
146+ } ) ,
147+ postgres_bind_address : env:: var ( "CUBESQL_PG_PORT" )
148+ . ok ( )
149+ . map ( |port| format ! ( "0.0.0.0:{}" , port. parse:: <u16 >( ) . unwrap( ) ) ) ,
150+ nonce : None ,
151+ query_timeout,
152+ timezone : Some ( "UTC" . to_string ( ) ) ,
153+ disable_strict_agg_type_match : env_parse (
154+ "CUBESQL_DISABLE_STRICT_AGG_TYPE_MATCH" ,
155+ false ,
156+ ) ,
157+ }
158+ }
129159}
130160
131161crate :: di_service!( ConfigObjImpl , [ ConfigObj ] ) ;
132- crate :: di_service!( MockConfigObj , [ ConfigObj ] ) ;
133162
134163impl ConfigObj for ConfigObjImpl {
135164 fn bind_address ( & self ) -> & Option < String > {
@@ -147,6 +176,10 @@ impl ConfigObj for ConfigObjImpl {
147176 fn query_timeout ( & self ) -> u64 {
148177 self . query_timeout
149178 }
179+
180+ fn disable_strict_agg_type_match ( & self ) -> bool {
181+ self . disable_strict_agg_type_match
182+ }
150183}
151184
152185lazy_static ! {
@@ -156,25 +189,9 @@ lazy_static! {
156189
157190impl Config {
158191 pub fn default ( ) -> Config {
159- let query_timeout = env:: var ( "CUBESQL_QUERY_TIMEOUT" )
160- . ok ( )
161- . map ( |v| v. parse :: < u64 > ( ) . unwrap ( ) )
162- . unwrap_or ( 120 ) ;
163192 Config {
164193 injector : Injector :: new ( ) ,
165- config_obj : Arc :: new ( ConfigObjImpl {
166- bind_address : env:: var ( "CUBESQL_BIND_ADDR" ) . ok ( ) . or_else ( || {
167- env:: var ( "CUBESQL_PORT" )
168- . ok ( )
169- . map ( |v| format ! ( "0.0.0.0:{}" , v. parse:: <u16 >( ) . unwrap( ) ) )
170- } ) ,
171- postgres_bind_address : env:: var ( "CUBESQL_PG_PORT" )
172- . ok ( )
173- . map ( |port| format ! ( "0.0.0.0:{}" , port. parse:: <u16 >( ) . unwrap( ) ) ) ,
174- nonce : None ,
175- query_timeout,
176- timezone : Some ( "UTC" . to_string ( ) ) ,
177- } ) ,
194+ config_obj : Arc :: new ( ConfigObjImpl :: default ( ) ) ,
178195 }
179196 }
180197
@@ -189,6 +206,7 @@ impl Config {
189206 nonce : None ,
190207 query_timeout,
191208 timezone,
209+ disable_strict_agg_type_match : false ,
192210 } ) ,
193211 }
194212 }
@@ -231,6 +249,7 @@ impl Config {
231249 i. get_service_typed ( ) . await ,
232250 i. get_service_typed ( ) . await ,
233251 config. nonce ( ) . clone ( ) ,
252+ config. clone ( ) ,
234253 ) )
235254 } )
236255 . await ;
@@ -287,4 +306,26 @@ impl Config {
287306 }
288307}
289308
309+ pub fn env_parse < T > ( name : & str , default : T ) -> T
310+ where
311+ T : FromStr ,
312+ T :: Err : Display ,
313+ {
314+ env_optparse ( name) . unwrap_or ( default)
315+ }
316+
317+ fn env_optparse < T > ( name : & str ) -> Option < T >
318+ where
319+ T : FromStr ,
320+ T :: Err : Display ,
321+ {
322+ env:: var ( name) . ok ( ) . map ( |x| match x. parse :: < T > ( ) {
323+ Ok ( v) => v,
324+ Err ( e) => panic ! (
325+ "Could not parse environment variable '{}' with '{}' value: {}" ,
326+ name, x, e
327+ ) ,
328+ } )
329+ }
330+
290331type LoopHandle = JoinHandle < Result < ( ) , CubeError > > ;
0 commit comments