@@ -77,29 +77,13 @@ impl HttpClient {
77
77
let start = Instant :: now ( ) ;
78
78
79
79
let url = "http://127.0.0.1:8000/v1/query" . to_string ( ) ;
80
- let mut response = self . response ( sql, & url, true ) . await ?;
81
- // Set session from response to client
82
- // Then client will same session for different queries.
83
-
84
- if response. session . is_some ( ) {
85
- self . session = response. session . clone ( ) ;
86
- }
87
-
88
- if let Some ( error) = response. error {
89
- return Err ( format_error ( error) . into ( ) ) ;
90
- }
91
-
92
- let rows = response. data ;
93
- let mut parsed_rows = parser_rows ( & rows) ?;
80
+ let mut parsed_rows = vec ! [ ] ;
81
+ let mut response =
82
+ self . handle_response ( self . post_query ( sql, & url) . await ?, & mut parsed_rows) ?;
94
83
while let Some ( next_uri) = response. next_uri {
95
- let mut url = "http://127.0.0.1:8000" . to_string ( ) ;
96
- url. push_str ( & next_uri) ;
97
- response = self . response ( sql, & url, false ) . await ?;
98
- if let Some ( error) = response. error {
99
- return Err ( format_error ( error) . into ( ) ) ;
100
- }
101
- let rows = response. data ;
102
- parsed_rows. append ( & mut parser_rows ( & rows) ?) ;
84
+ let url = format ! ( "http://127.0.0.1:8000{next_uri}" ) ;
85
+ response =
86
+ self . handle_response ( self . poll_query_result ( & url) . await ?, & mut parsed_rows) ?;
103
87
}
104
88
// Todo: add types to compare
105
89
let mut types = vec ! [ ] ;
@@ -120,32 +104,48 @@ impl HttpClient {
120
104
} )
121
105
}
122
106
107
+ fn handle_response (
108
+ & mut self ,
109
+ response : QueryResponse ,
110
+ parsed_rows : & mut Vec < Vec < String > > ,
111
+ ) -> Result < QueryResponse > {
112
+ if response. session . is_some ( ) {
113
+ self . session = response. session . clone ( ) ;
114
+ }
115
+ if let Some ( error) = response. error {
116
+ Err ( format_error ( error) . into ( ) )
117
+ } else {
118
+ parsed_rows. append ( & mut parser_rows ( & response. data ) ?) ;
119
+ Ok ( response)
120
+ }
121
+ }
122
+
123
123
// Send request and get response by json format
124
- async fn response ( & mut self , sql : & str , url : & str , post : bool ) -> Result < QueryResponse > {
124
+ async fn post_query ( & self , sql : & str , url : & str ) -> Result < QueryResponse > {
125
125
let mut query = HashMap :: new ( ) ;
126
126
query. insert ( "sql" , serde_json:: to_value ( sql) ?) ;
127
127
if let Some ( session) = & self . session {
128
128
query. insert ( "session" , serde_json:: to_value ( session) ?) ;
129
129
}
130
- if post {
131
- return Ok ( self
132
- . client
133
- . post ( url)
134
- . json ( & query)
135
- . basic_auth ( "root" , Some ( "" ) )
136
- . send ( )
137
- . await ?
138
- . json :: < QueryResponse > ( )
139
- . await ?) ;
140
- }
141
130
Ok ( self
142
131
. client
143
- . get ( url)
132
+ . post ( url)
144
133
. json ( & query)
145
134
. basic_auth ( "root" , Some ( "" ) )
146
135
. send ( )
147
136
. await ?
148
137
. json :: < QueryResponse > ( )
149
138
. await ?)
150
139
}
140
+
141
+ async fn poll_query_result ( & self , url : & str ) -> Result < QueryResponse > {
142
+ Ok ( self
143
+ . client
144
+ . get ( url)
145
+ . basic_auth ( "root" , Some ( "" ) )
146
+ . send ( )
147
+ . await ?
148
+ . json :: < QueryResponse > ( )
149
+ . await ?)
150
+ }
151
151
}
0 commit comments