@@ -15,7 +15,7 @@ pub struct QueryExecutor<T: DeserializeOwned> {
15
15
items_link : ResourceLink ,
16
16
context : Context < ' static > ,
17
17
query_engine : QueryEngineRef ,
18
- base_request : Request ,
18
+ base_request : Option < Request > ,
19
19
query : Query ,
20
20
pipeline : Option < OwnedQueryPipeline > ,
21
21
@@ -37,15 +37,13 @@ impl<T: DeserializeOwned + 'static> QueryExecutor<T> {
37
37
) -> azure_core:: Result < Self > {
38
38
let items_link = container_link. feed ( ResourceType :: Items ) ;
39
39
let context = options. method_options . context . into_owned ( ) ;
40
- let base_request =
41
- pipeline:: create_base_query_request ( http_pipeline. url ( & items_link) , & query) ?;
42
40
Ok ( Self {
43
41
http_pipeline,
44
42
container_link,
45
43
items_link,
46
44
context,
47
45
query_engine,
48
- base_request,
46
+ base_request : None ,
49
47
query,
50
48
pipeline : None ,
51
49
phantom : std:: marker:: PhantomData ,
@@ -69,8 +67,13 @@ impl<T: DeserializeOwned + 'static> QueryExecutor<T> {
69
67
/// An item to yield, or None if execution is complete.
70
68
#[ tracing:: instrument( skip_all) ]
71
69
async fn step ( & mut self ) -> azure_core:: Result < Option < FeedPage < T > > > {
72
- let pipeline = match self . pipeline . as_mut ( ) {
73
- Some ( pipeline) => pipeline,
70
+ let ( pipeline, base_request) = match self . pipeline . as_mut ( ) {
71
+ Some ( pipeline) => (
72
+ pipeline,
73
+ self . base_request
74
+ . as_ref ( )
75
+ . expect ( "base_request should be set when pipeline is set" ) ,
76
+ ) ,
74
77
None => {
75
78
// Initialize the pipeline.
76
79
let query_plan = get_query_plan (
@@ -97,8 +100,16 @@ impl<T: DeserializeOwned + 'static> QueryExecutor<T> {
97
100
let pipeline =
98
101
self . query_engine
99
102
. create_pipeline ( & self . query . text , & query_plan, & pkranges) ?;
103
+ self . query . text = pipeline. query ( ) . into ( ) ;
104
+ self . base_request = Some ( crate :: pipeline:: create_base_query_request (
105
+ self . http_pipeline . url ( & self . items_link ) ,
106
+ & self . query ,
107
+ ) ?) ;
100
108
self . pipeline = Some ( pipeline) ;
101
- self . pipeline . as_mut ( ) . expect ( "we just set it" )
109
+ (
110
+ self . pipeline . as_mut ( ) . unwrap ( ) ,
111
+ self . base_request . as_ref ( ) . unwrap ( ) ,
112
+ )
102
113
}
103
114
} ;
104
115
@@ -113,7 +124,7 @@ impl<T: DeserializeOwned + 'static> QueryExecutor<T> {
113
124
let items = results
114
125
. items
115
126
. into_iter ( )
116
- . map ( |item| serde_json:: from_slice :: < T > ( & item) )
127
+ . map ( |item| serde_json:: from_str :: < T > ( item. get ( ) ) )
117
128
. collect :: < Result < Vec < _ > , _ > > ( ) ?;
118
129
119
130
// TODO: Provide a continuation token.
@@ -122,7 +133,7 @@ impl<T: DeserializeOwned + 'static> QueryExecutor<T> {
122
133
123
134
// No items, so make any requests we need to make and provide them to the pipeline.
124
135
for request in results. requests {
125
- let mut query_request = self . base_request . clone ( ) ;
136
+ let mut query_request = base_request. clone ( ) ;
126
137
query_request. insert_header (
127
138
constants:: PARTITION_KEY_RANGE_ID ,
128
139
request. partition_key_range_id . clone ( ) ,
0 commit comments