Skip to content

Commit 337687f

Browse files
impl From<Scratch> for PR
1 parent 51be4ee commit 337687f

File tree

7 files changed

+182
-216
lines changed

7 files changed

+182
-216
lines changed

crates/pg_completions/src/builder.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
use crate::{CompletionItem, CompletionResult};
1+
use crate::{item::CompletionItem, CompletionResult};
22

3-
pub struct CompletionBuilder<'a> {
4-
pub items: Vec<CompletionItem<'a>>,
3+
pub struct CompletionBuilder {
4+
pub items: Vec<CompletionItem>,
55
}
66

77
pub struct CompletionConfig {}
88

9-
impl<'a> From<&'a CompletionConfig> for CompletionBuilder<'a> {
9+
impl From<&CompletionConfig> for CompletionBuilder {
1010
fn from(_config: &CompletionConfig) -> Self {
1111
Self { items: Vec::new() }
1212
}
1313
}
1414

15-
impl<'a> CompletionBuilder<'a> {
16-
pub fn finish(mut self) -> CompletionResult<'a> {
15+
impl CompletionBuilder {
16+
pub fn finish(mut self) -> CompletionResult {
1717
self.items.sort_by(|a, b| {
1818
b.preselect
1919
.cmp(&a.preselect)

crates/pg_completions/src/complete.rs

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
use text_size::TextSize;
2+
3+
use crate::{builder, context::CompletionContext, item::CompletionItem};
4+
5+
pub const LIMIT: usize = 50;
6+
7+
#[derive(Debug)]
8+
pub struct CompletionParams<'a> {
9+
pub position: TextSize,
10+
pub schema: &'a pg_schema_cache::SchemaCache,
11+
pub text: &'a str,
12+
pub tree: Option<&'a tree_sitter::Tree>,
13+
}
14+
15+
#[derive(Debug, Default)]
16+
pub struct CompletionResult {
17+
pub items: Vec<CompletionItem>,
18+
}
19+
20+
pub fn complete(params: &CompletionParams) -> CompletionResult {
21+
let ctx = CompletionContext::new(params);
22+
let mut builder = builder::CompletionBuilder::from(&builder::CompletionConfig {});
23+
24+
builder.finish()
25+
}
26+
27+
#[cfg(test)]
28+
mod tests {
29+
use pg_schema_cache::SchemaCache;
30+
use pg_test_utils::test_database::*;
31+
32+
use sqlx::Executor;
33+
34+
use crate::{complete, CompletionParams};
35+
36+
#[tokio::test]
37+
async fn test_complete() {
38+
let pool = get_new_test_db().await;
39+
40+
let input = "select id from c;";
41+
42+
let mut parser = tree_sitter::Parser::new();
43+
parser
44+
.set_language(tree_sitter_sql::language())
45+
.expect("Error loading sql language");
46+
47+
let tree = parser.parse(input, None).unwrap();
48+
49+
let schema_cache = SchemaCache::load(&pool).await;
50+
51+
let p = CompletionParams {
52+
position: 15.into(),
53+
schema: &schema_cache,
54+
text: input,
55+
tree: Some(&tree),
56+
};
57+
58+
let result = complete(&p);
59+
60+
assert!(result.items.len() > 0);
61+
}
62+
63+
#[tokio::test]
64+
async fn test_complete_two() {
65+
let pool = get_new_test_db().await;
66+
67+
let input = "select id, name, test1231234123, unknown from co;";
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(&pool).await;
76+
77+
let p = CompletionParams {
78+
position: 47.into(),
79+
schema: &schema_cache,
80+
text: input,
81+
tree: Some(&tree),
82+
};
83+
84+
let result = complete(&p);
85+
86+
assert!(result.items.len() > 0);
87+
}
88+
89+
#[tokio::test]
90+
async fn test_complete_three() {
91+
let test_db = get_new_test_db().await;
92+
93+
let setup = r#"
94+
create table users (
95+
id serial primary key,
96+
name text,
97+
password text
98+
);
99+
"#;
100+
101+
test_db
102+
.execute(setup)
103+
.await
104+
.expect("Failed to execute setup query");
105+
106+
let input = "select * from u";
107+
108+
let mut parser = tree_sitter::Parser::new();
109+
parser
110+
.set_language(tree_sitter_sql::language())
111+
.expect("Error loading sql language");
112+
113+
let tree = parser.parse(input, None).unwrap();
114+
let schema_cache = SchemaCache::load(&test_db).await;
115+
116+
let p = CompletionParams {
117+
position: ((input.len() - 1) as u32).into(),
118+
schema: &schema_cache,
119+
text: input,
120+
tree: Some(&tree),
121+
};
122+
123+
let result = complete(&p);
124+
125+
// TODO: actually assert that we get good autocompletion suggestions
126+
assert!(result.items.len() > 0);
127+
}
128+
}

crates/pg_completions/src/context.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
use crate::CompletionParams;
2+
3+
pub struct CompletionContext {}
4+
5+
impl CompletionContext {
6+
pub fn new(params: &CompletionParams) -> Self {
7+
todo!()
8+
}
9+
}

crates/pg_completions/src/item.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
use text_size::TextRange;
2+
3+
#[derive(Debug, PartialEq, Eq)]
4+
pub enum CompletionItemData {
5+
Table(pg_schema_cache::Table),
6+
}
7+
8+
impl CompletionItemData {
9+
pub fn label(&self) -> &str {
10+
match self {
11+
CompletionItemData::Table(t) => t.name.as_str(),
12+
}
13+
}
14+
}
15+
16+
#[derive(Debug, PartialEq, Eq)]
17+
pub struct CompletionItem {
18+
pub score: i32,
19+
pub range: TextRange,
20+
pub preselect: bool,
21+
pub data: CompletionItemData,
22+
}
23+
24+
impl CompletionItem {
25+
pub fn new_simple(score: i32, range: TextRange, data: CompletionItemData) -> Self {
26+
Self {
27+
score,
28+
range,
29+
preselect: false,
30+
data,
31+
}
32+
}
33+
}

crates/pg_completions/src/lib.rs

Lines changed: 5 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -1,165 +1,7 @@
11
mod builder;
2-
mod providers;
2+
mod complete;
3+
mod context;
4+
mod item;
5+
mod relevance;
36

4-
pub use providers::CompletionProviderParams;
5-
use text_size::{TextRange, TextSize};
6-
7-
pub const LIMIT: usize = 50;
8-
9-
#[derive(Debug)]
10-
pub struct CompletionParams<'a> {
11-
pub position: TextSize,
12-
pub schema: &'a pg_schema_cache::SchemaCache,
13-
pub text: &'a str,
14-
pub tree: Option<&'a tree_sitter::Tree>,
15-
}
16-
17-
#[derive(Debug, Default)]
18-
pub struct CompletionResult<'a> {
19-
pub items: Vec<CompletionItem<'a>>,
20-
}
21-
22-
#[derive(Debug, PartialEq, Eq)]
23-
pub struct CompletionItem<'a> {
24-
pub score: i32,
25-
pub range: TextRange,
26-
pub preselect: bool,
27-
pub data: CompletionItemData<'a>,
28-
}
29-
30-
#[derive(Debug, PartialEq, Eq)]
31-
pub enum CompletionItemData<'a> {
32-
Table(&'a pg_schema_cache::Table),
33-
}
34-
35-
impl<'a> CompletionItemData<'a> {
36-
pub fn label(&self) -> &'a str {
37-
match self {
38-
CompletionItemData::Table(t) => t.name.as_str(),
39-
}
40-
}
41-
}
42-
43-
impl<'a> CompletionItem<'a> {
44-
pub fn new_simple(score: i32, range: TextRange, data: CompletionItemData<'a>) -> Self {
45-
Self {
46-
score,
47-
range,
48-
preselect: false,
49-
data,
50-
}
51-
}
52-
}
53-
54-
pub fn complete<'a>(params: &'a CompletionParams<'a>) -> CompletionResult<'a> {
55-
let mut builder = builder::CompletionBuilder::from(&builder::CompletionConfig {});
56-
57-
let params = CompletionProviderParams::from(params);
58-
59-
providers::complete_tables(params, &mut builder);
60-
61-
builder.finish()
62-
}
63-
64-
#[cfg(test)]
65-
mod tests {
66-
use pg_schema_cache::SchemaCache;
67-
use pg_test_utils::test_database::*;
68-
69-
use sqlx::Executor;
70-
71-
use crate::{complete, CompletionParams};
72-
73-
#[tokio::test]
74-
async fn test_complete() {
75-
let pool = get_new_test_db().await;
76-
77-
let input = "select id from c;";
78-
79-
let mut parser = tree_sitter::Parser::new();
80-
parser
81-
.set_language(tree_sitter_sql::language())
82-
.expect("Error loading sql language");
83-
84-
let tree = parser.parse(input, None).unwrap();
85-
86-
let schema_cache = SchemaCache::load(&pool).await;
87-
88-
let p = CompletionParams {
89-
position: 15.into(),
90-
schema: &schema_cache,
91-
text: input,
92-
tree: Some(&tree),
93-
};
94-
95-
let result = complete(&p);
96-
97-
assert!(result.items.len() > 0);
98-
}
99-
100-
#[tokio::test]
101-
async fn test_complete_two() {
102-
let pool = get_new_test_db().await;
103-
104-
let input = "select id, name, test1231234123, unknown from co;";
105-
106-
let mut parser = tree_sitter::Parser::new();
107-
parser
108-
.set_language(tree_sitter_sql::language())
109-
.expect("Error loading sql language");
110-
111-
let tree = parser.parse(input, None).unwrap();
112-
let schema_cache = SchemaCache::load(&pool).await;
113-
114-
let p = CompletionParams {
115-
position: 47.into(),
116-
schema: &schema_cache,
117-
text: input,
118-
tree: Some(&tree),
119-
};
120-
121-
let result = complete(&p);
122-
123-
assert!(result.items.len() > 0);
124-
}
125-
126-
#[tokio::test]
127-
async fn test_complete_three() {
128-
let test_db = get_new_test_db().await;
129-
130-
let setup = r#"
131-
create table users (
132-
id serial primary key,
133-
name text,
134-
password text
135-
);
136-
"#;
137-
138-
test_db
139-
.execute(setup)
140-
.await
141-
.expect("Failed to execute setup query");
142-
143-
let input = "select * from u";
144-
145-
let mut parser = tree_sitter::Parser::new();
146-
parser
147-
.set_language(tree_sitter_sql::language())
148-
.expect("Error loading sql language");
149-
150-
let tree = parser.parse(input, None).unwrap();
151-
let schema_cache = SchemaCache::load(&test_db).await;
152-
153-
let p = CompletionParams {
154-
position: ((input.len() - 1) as u32).into(),
155-
schema: &schema_cache,
156-
text: input,
157-
tree: Some(&tree),
158-
};
159-
160-
let result = complete(&p);
161-
162-
// TODO: actually assert that we get good autocompletion suggestions
163-
assert!(result.items.len() > 0);
164-
}
165-
}
7+
pub use complete::*;

0 commit comments

Comments
 (0)