@@ -5,11 +5,11 @@ use common::{
55 query:: Query ,
66 runtime:: Runtime ,
77 static_span,
8+ version:: Version ,
89} ;
910use database:: {
1011 query:: TableFilter ,
1112 DeveloperQuery ,
12- Transaction ,
1313} ;
1414use errors:: ErrorMetadata ;
1515use serde:: {
@@ -23,13 +23,12 @@ use serde_json::{
2323use value:: {
2424 id_v6:: DocumentIdV6 ,
2525 InternalId ,
26+ TableIdAndTableNumber ,
2627 TableName ,
28+ TableNumber ,
2729} ;
2830
29- use super :: {
30- async_syscall:: QueryManager ,
31- DatabaseUdfEnvironment ,
32- } ;
31+ use super :: DatabaseUdfEnvironment ;
3332use crate :: environment:: helpers:: {
3433 parse_version,
3534 with_argument_error,
@@ -38,8 +37,12 @@ use crate::environment::helpers::{
3837
3938pub trait SyscallProvider < RT : Runtime > {
4039 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 ;
4346}
4447
4548impl < RT : Runtime > SyscallProvider < RT > for DatabaseUdfEnvironment < RT > {
@@ -51,12 +54,29 @@ impl<RT: Runtime> SyscallProvider<RT> for DatabaseUdfEnvironment<RT> {
5154 }
5255 }
5356
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)
5676 }
5777
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 )
6080 }
6181}
6282
@@ -111,18 +131,11 @@ fn syscall_normalize_id<RT: Runtime, P: SyscallProvider<RT>>(
111131 let table_name: TableName = args. table . parse ( ) . context ( ArgName ( "table" ) ) ?;
112132 Ok ( ( table_name, args. id_string ) )
113133 } ) ?;
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) ?;
118135 let table_number = match virtual_table_number {
119136 Some ( table_number) => Some ( table_number) ,
120137 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 ) ;
126139 match provider. table_filter ( ) {
127140 TableFilter :: IncludePrivateSystemTables => physical_table_number,
128141 TableFilter :: ExcludePrivateSystemTables if table_name. is_system ( ) => None ,
@@ -155,9 +168,7 @@ fn syscall_query_stream<RT: Runtime, P: SyscallProvider<RT>>(
155168 provider : & mut P ,
156169 args : JsonValue ,
157170) -> 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 ! ( ) ;
161172
162173 #[ derive( Deserialize ) ]
163174 struct QueryStreamArgs {
@@ -170,11 +181,7 @@ fn syscall_query_stream<RT: Runtime, P: SyscallProvider<RT>>(
170181 let version = parse_version ( args. version ) ?;
171182 Ok ( ( parsed_query, version) )
172183 } ) ?;
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) ?;
178185
179186 #[ derive( Serialize ) ]
180187 #[ serde( rename_all = "camelCase" ) ]
@@ -197,6 +204,6 @@ fn syscall_query_cleanup<RT: Runtime, P: SyscallProvider<RT>>(
197204 }
198205 let args: QueryCleanupArgs =
199206 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 ) ;
201208 Ok ( serde_json:: to_value ( cleaned_up) ?)
202209}
0 commit comments