11use text_size:: TextSize ;
22
33use crate :: {
4- builder:: CompletionBuilder , context:: CompletionContext , item:: CompletionItem ,
5- providers:: complete_tables,
4+ builder:: CompletionBuilder ,
5+ context:: CompletionContext ,
6+ item:: CompletionItem ,
7+ providers:: { complete_functions, complete_tables} ,
68} ;
79
810pub const LIMIT : usize = 50 ;
@@ -11,7 +13,7 @@ pub const LIMIT: usize = 50;
1113pub struct CompletionParams < ' a > {
1214 pub position : TextSize ,
1315 pub schema : & ' a pg_schema_cache:: SchemaCache ,
14- pub text : & ' a str ,
16+ pub text : String ,
1517 pub tree : Option < & ' a tree_sitter:: Tree > ,
1618}
1719
@@ -34,192 +36,7 @@ pub fn complete(params: CompletionParams) -> CompletionResult {
3436 let mut builder = CompletionBuilder :: new ( ) ;
3537
3638 complete_tables ( & ctx, & mut builder) ;
39+ complete_functions ( & ctx, & mut builder) ;
3740
3841 builder. finish ( )
3942}
40-
41- #[ cfg( test) ]
42- mod tests {
43- use pg_schema_cache:: SchemaCache ;
44- use pg_test_utils:: test_database:: * ;
45-
46- use sqlx:: Executor ;
47-
48- use crate :: { complete, CompletionParams } ;
49-
50- #[ tokio:: test]
51- async fn autocompletes_simple_table ( ) {
52- let test_db = get_new_test_db ( ) . await ;
53-
54- let setup = r#"
55- create table users (
56- id serial primary key,
57- name text,
58- password text
59- );
60- "# ;
61-
62- test_db
63- . execute ( setup)
64- . await
65- . expect ( "Failed to execute setup query" ) ;
66-
67- let input = "select * from u" ;
68-
69- let mut parser = tree_sitter:: Parser :: new ( ) ;
70- parser
71- . set_language ( tree_sitter_sql:: language ( ) )
72- . expect ( "Error loading sql language" ) ;
73-
74- let tree = parser. parse ( input, None ) . unwrap ( ) ;
75- let schema_cache = SchemaCache :: load ( & test_db)
76- . await
77- . expect ( "Couldn't load Schema Cache" ) ;
78-
79- let p = CompletionParams {
80- position : ( ( input. len ( ) - 1 ) as u32 ) . into ( ) ,
81- schema : & schema_cache,
82- text : input,
83- tree : Some ( & tree) ,
84- } ;
85-
86- let result = complete ( p) ;
87-
88- assert ! ( !result. items. is_empty( ) ) ;
89-
90- let best_match = & result. items [ 0 ] ;
91-
92- assert_eq ! (
93- best_match. label, "users" ,
94- "Does not return the expected table to autocomplete: {}" ,
95- best_match. label
96- )
97- }
98-
99- #[ tokio:: test]
100- async fn autocompletes_table_alphanumerically ( ) {
101- let test_db = get_new_test_db ( ) . await ;
102-
103- let setup = r#"
104- create table addresses (
105- id serial primary key
106- );
107-
108- create table users (
109- id serial primary key
110- );
111-
112- create table emails (
113- id serial primary key
114- );
115- "# ;
116-
117- test_db
118- . execute ( setup)
119- . await
120- . expect ( "Failed to execute setup query" ) ;
121-
122- let schema_cache = SchemaCache :: load ( & test_db)
123- . await
124- . expect ( "Couldn't load Schema Cache" ) ;
125-
126- let mut parser = tree_sitter:: Parser :: new ( ) ;
127- parser
128- . set_language ( tree_sitter_sql:: language ( ) )
129- . expect ( "Error loading sql language" ) ;
130-
131- let test_cases = vec ! [
132- ( "select * from us" , "users" ) ,
133- ( "select * from em" , "emails" ) ,
134- ( "select * from " , "addresses" ) ,
135- ] ;
136-
137- for ( input, expected_label) in test_cases {
138- let tree = parser. parse ( input, None ) . unwrap ( ) ;
139-
140- let p = CompletionParams {
141- position : ( ( input. len ( ) - 1 ) as u32 ) . into ( ) ,
142- schema : & schema_cache,
143- text : input,
144- tree : Some ( & tree) ,
145- } ;
146-
147- let result = complete ( p) ;
148-
149- assert ! ( !result. items. is_empty( ) ) ;
150-
151- let best_match = & result. items [ 0 ] ;
152-
153- assert_eq ! (
154- best_match. label, expected_label,
155- "Does not return the expected table to autocomplete: {}" ,
156- best_match. label
157- )
158- }
159- }
160-
161- #[ tokio:: test]
162- async fn autocompletes_table_with_schema ( ) {
163- let test_db = get_new_test_db ( ) . await ;
164-
165- let setup = r#"
166- create schema customer_support;
167- create schema private;
168-
169- create table private.user_z (
170- id serial primary key,
171- name text,
172- password text
173- );
174-
175- create table customer_support.user_y (
176- id serial primary key,
177- request text,
178- send_at timestamp with time zone
179- );
180- "# ;
181-
182- test_db
183- . execute ( setup)
184- . await
185- . expect ( "Failed to execute setup query" ) ;
186-
187- let schema_cache = SchemaCache :: load ( & test_db)
188- . await
189- . expect ( "Couldn't load SchemaCache" ) ;
190-
191- let mut parser = tree_sitter:: Parser :: new ( ) ;
192- parser
193- . set_language ( tree_sitter_sql:: language ( ) )
194- . expect ( "Error loading sql language" ) ;
195-
196- let test_cases = vec ! [
197- ( "select * from u" , "user_y" ) , // user_y is preferred alphanumerically
198- ( "select * from private.u" , "user_z" ) ,
199- ( "select * from customer_support.u" , "user_y" ) ,
200- ] ;
201-
202- for ( input, expected_label) in test_cases {
203- let tree = parser. parse ( input, None ) . unwrap ( ) ;
204-
205- let p = CompletionParams {
206- position : ( ( input. len ( ) - 1 ) as u32 ) . into ( ) ,
207- schema : & schema_cache,
208- text : input,
209- tree : Some ( & tree) ,
210- } ;
211-
212- let result = complete ( p) ;
213-
214- assert ! ( !result. items. is_empty( ) ) ;
215-
216- let best_match = & result. items [ 0 ] ;
217-
218- assert_eq ! (
219- best_match. label, expected_label,
220- "Does not return the expected table to autocomplete: {}" ,
221- best_match. label
222- )
223- }
224- }
225- }
0 commit comments