1717 */
1818
1919use chrono:: { DateTime , Utc } ;
20+ use datafusion:: arrow:: datatypes:: Schema ;
2021use datafusion:: arrow:: record_batch:: RecordBatch ;
2122use datafusion:: datasource:: file_format:: parquet:: ParquetFormat ;
2223use datafusion:: datasource:: listing:: ListingOptions ;
@@ -44,6 +45,7 @@ fn get_value<'a>(value: &'a Value, key: &'static str) -> Result<&'a str, Error>
4445pub struct Query {
4546 pub query : String ,
4647 pub stream_name : String ,
48+ pub schema : Arc < Schema > ,
4749 pub start : DateTime < Utc > ,
4850 pub end : DateTime < Utc > ,
4951}
@@ -123,10 +125,25 @@ impl Query {
123125#[ cfg( test) ]
124126mod tests {
125127 use super :: Query ;
128+ use crate :: { alerts:: Alerts , metadata:: STREAM_INFO } ;
129+ use datafusion:: arrow:: datatypes:: Schema ;
130+ use datafusion:: arrow:: datatypes:: { DataType , Field } ;
126131 use rstest:: * ;
127132 use serde_json:: Value ;
128133 use std:: str:: FromStr ;
129134
135+ #[ fixture]
136+ fn schema ( ) -> Schema {
137+ let field_a = Field :: new ( "a" , DataType :: Int64 , false ) ;
138+ let field_b = Field :: new ( "b" , DataType :: Boolean , false ) ;
139+ Schema :: new ( vec ! [ field_a, field_b] )
140+ }
141+
142+ fn clear_map ( ) {
143+ STREAM_INFO . write ( ) . unwrap ( ) . clear ( ) ;
144+ }
145+
146+ // A query can only be performed on streams with a valid schema
130147 #[ rstest]
131148 #[ case(
132149 r#"{
@@ -144,12 +161,38 @@ mod tests {
144161 }"# ,
145162 & [ "stream_name/date=2022-10-15/hour=10/minute=00/" , "stream_name/date=2022-10-15/hour=10/minute=01/" ]
146163 ) ]
147- fn query_parse_prefix ( #[ case] prefix : & str , #[ case] right : & [ & str ] ) {
164+ #[ serial_test:: serial]
165+ fn query_parse_prefix_with_some_schema ( #[ case] prefix : & str , #[ case] right : & [ & str ] ) {
166+ clear_map ( ) ;
167+ STREAM_INFO
168+ . add_stream ( "stream_name" . to_string ( ) , Some ( schema ( ) ) , Alerts :: default ( ) )
169+ . unwrap ( ) ;
170+
148171 let query = Value :: from_str ( prefix) . unwrap ( ) ;
149172 let query = Query :: parse ( query) . unwrap ( ) ;
150173 assert_eq ! ( & query. stream_name, "stream_name" ) ;
151174 let prefixes = query. get_prefixes ( ) ;
152175 let left = prefixes. iter ( ) . map ( String :: as_str) . collect :: < Vec < & str > > ( ) ;
153176 assert_eq ! ( left. as_slice( ) , right) ;
154177 }
178+
179+ // If there is no schema for this stream then parsing a Query should fail
180+ #[ rstest]
181+ #[ case(
182+ r#"{
183+ "query": "SELECT * FROM stream_name",
184+ "startTime": "2022-10-15T10:00:00+00:00",
185+ "endTime": "2022-10-15T10:01:00+00:00"
186+ }"#
187+ ) ]
188+ #[ serial_test:: serial]
189+ fn query_parse_prefix_with_no_schema ( #[ case] prefix : & str ) {
190+ clear_map ( ) ;
191+ STREAM_INFO
192+ . add_stream ( "stream_name" . to_string ( ) , None , Alerts :: default ( ) )
193+ . unwrap ( ) ;
194+
195+ let query = Value :: from_str ( prefix) . unwrap ( ) ;
196+ assert ! ( Query :: parse( query) . is_err( ) ) ;
197+ }
155198}
0 commit comments