@@ -5,11 +5,11 @@ use common::{
5
5
query:: Query ,
6
6
runtime:: Runtime ,
7
7
static_span,
8
+ version:: Version ,
8
9
} ;
9
10
use database:: {
10
11
query:: TableFilter ,
11
12
DeveloperQuery ,
12
- Transaction ,
13
13
} ;
14
14
use errors:: ErrorMetadata ;
15
15
use serde:: {
@@ -23,13 +23,12 @@ use serde_json::{
23
23
use value:: {
24
24
id_v6:: DocumentIdV6 ,
25
25
InternalId ,
26
+ TableIdAndTableNumber ,
26
27
TableName ,
28
+ TableNumber ,
27
29
} ;
28
30
29
- use super :: {
30
- async_syscall:: QueryManager ,
31
- DatabaseUdfEnvironment ,
32
- } ;
31
+ use super :: DatabaseUdfEnvironment ;
33
32
use crate :: environment:: helpers:: {
34
33
parse_version,
35
34
with_argument_error,
@@ -38,8 +37,12 @@ use crate::environment::helpers::{
38
37
39
38
pub trait SyscallProvider < RT : Runtime > {
40
39
fn table_filter ( & self ) -> TableFilter ;
41
- fn query_manager ( & mut self ) -> & mut QueryManager < RT > ;
42
- fn tx ( & mut self ) -> Result < & mut Transaction < RT > , ErrorMetadata > ;
40
+
41
+ fn lookup_table ( & mut self , name : & TableName ) -> anyhow:: Result < Option < TableIdAndTableNumber > > ;
42
+ fn lookup_virtual_table ( & mut self , name : & TableName ) -> anyhow:: Result < Option < TableNumber > > ;
43
+
44
+ fn start_query ( & mut self , query : Query , version : Option < Version > ) -> anyhow:: Result < u32 > ;
45
+ fn cleanup_query ( & mut self , query_id : u32 ) -> bool ;
43
46
}
44
47
45
48
impl < RT : Runtime > SyscallProvider < RT > for DatabaseUdfEnvironment < RT > {
@@ -51,12 +54,29 @@ impl<RT: Runtime> SyscallProvider<RT> for DatabaseUdfEnvironment<RT> {
51
54
}
52
55
}
53
56
54
- fn query_manager ( & mut self ) -> & mut QueryManager < RT > {
55
- & mut self . query_manager
57
+ fn lookup_table ( & mut self , name : & TableName ) -> anyhow:: Result < Option < TableIdAndTableNumber > > {
58
+ let table_mapping = self . phase . tx ( ) ?. table_mapping ( ) ;
59
+ Ok ( table_mapping. id_and_number_if_exists ( name) )
60
+ }
61
+
62
+ fn lookup_virtual_table ( & mut self , name : & TableName ) -> anyhow:: Result < Option < TableNumber > > {
63
+ let virtual_table_mapping = self . phase . tx ( ) ?. virtual_table_mapping ( ) ;
64
+ Ok ( virtual_table_mapping. number_if_exists ( name) )
65
+ }
66
+
67
+ fn start_query ( & mut self , query : Query , version : Option < Version > ) -> anyhow:: Result < u32 > {
68
+ let table_filter = self . table_filter ( ) ;
69
+ let tx = self . phase . tx ( ) ?;
70
+ // TODO: Are all invalid query pipelines developer errors? These could be bugs
71
+ // in convex/server.
72
+ let compiled_query =
73
+ { DeveloperQuery :: new_with_version ( tx, query, version, table_filter) ? } ;
74
+ let query_id = self . query_manager . put_developer ( compiled_query) ;
75
+ Ok ( query_id)
56
76
}
57
77
58
- fn tx ( & mut self ) -> Result < & mut Transaction < RT > , ErrorMetadata > {
59
- self . phase . tx ( )
78
+ fn cleanup_query ( & mut self , query_id : u32 ) -> bool {
79
+ self . query_manager . cleanup_developer ( query_id )
60
80
}
61
81
}
62
82
@@ -111,18 +131,11 @@ fn syscall_normalize_id<RT: Runtime, P: SyscallProvider<RT>>(
111
131
let table_name: TableName = args. table . parse ( ) . context ( ArgName ( "table" ) ) ?;
112
132
Ok ( ( table_name, args. id_string ) )
113
133
} ) ?;
114
- let virtual_table_number = provider
115
- . tx ( ) ?
116
- . virtual_table_mapping ( )
117
- . number_if_exists ( & table_name) ;
134
+ let virtual_table_number = provider. lookup_virtual_table ( & table_name) ?;
118
135
let table_number = match virtual_table_number {
119
136
Some ( table_number) => Some ( table_number) ,
120
137
None => {
121
- let physical_table_number = provider
122
- . tx ( ) ?
123
- . table_mapping ( )
124
- . id_and_number_if_exists ( & table_name)
125
- . map ( |t| t. table_number ) ;
138
+ let physical_table_number = provider. lookup_table ( & table_name) ?. map ( |t| t. table_number ) ;
126
139
match provider. table_filter ( ) {
127
140
TableFilter :: IncludePrivateSystemTables => physical_table_number,
128
141
TableFilter :: ExcludePrivateSystemTables if table_name. is_system ( ) => None ,
@@ -155,9 +168,7 @@ fn syscall_query_stream<RT: Runtime, P: SyscallProvider<RT>>(
155
168
provider : & mut P ,
156
169
args : JsonValue ,
157
170
) -> anyhow:: Result < JsonValue > {
158
- let _s: common:: tracing:: NoopSpan = static_span ! ( ) ;
159
- let table_filter = provider. table_filter ( ) ;
160
- let tx = provider. tx ( ) ?;
171
+ let _s = static_span ! ( ) ;
161
172
162
173
#[ derive( Deserialize ) ]
163
174
struct QueryStreamArgs {
@@ -170,11 +181,7 @@ fn syscall_query_stream<RT: Runtime, P: SyscallProvider<RT>>(
170
181
let version = parse_version ( args. version ) ?;
171
182
Ok ( ( parsed_query, version) )
172
183
} ) ?;
173
- // TODO: Are all invalid query pipelines developer errors? These could be bugs
174
- // in convex/server.
175
- let compiled_query =
176
- { DeveloperQuery :: new_with_version ( tx, parsed_query, version, table_filter) ? } ;
177
- let query_id = provider. query_manager ( ) . put_developer ( compiled_query) ;
184
+ let query_id = provider. start_query ( parsed_query, version) ?;
178
185
179
186
#[ derive( Serialize ) ]
180
187
#[ serde( rename_all = "camelCase" ) ]
@@ -197,6 +204,6 @@ fn syscall_query_cleanup<RT: Runtime, P: SyscallProvider<RT>>(
197
204
}
198
205
let args: QueryCleanupArgs =
199
206
with_argument_error ( "queryCleanup" , || Ok ( serde_json:: from_value ( args) ?) ) ?;
200
- let cleaned_up = provider. query_manager ( ) . cleanup_developer ( args. query_id ) ;
207
+ let cleaned_up = provider. cleanup_query ( args. query_id ) ;
201
208
Ok ( serde_json:: to_value ( cleaned_up) ?)
202
209
}
0 commit comments