1use crate::{
2 DataSet, quote_cow,
3 writer::{Context, SqlWriter},
4};
5use proc_macro2::TokenStream;
6use quote::{ToTokens, TokenStreamExt, quote};
7use std::borrow::Cow;
8
9#[derive(Default, Clone, PartialEq, Eq, Debug)]
10pub struct TableRef {
11 pub name: &'static str,
12 pub schema: &'static str,
13 pub alias: Cow<'static, str>,
14}
15
16impl TableRef {
17 pub fn full_name(&self) -> String {
18 let mut result = String::new();
19 if !self.alias.is_empty() {
20 result.push_str(&self.alias);
21 } else {
22 if !self.schema.is_empty() {
23 result.push_str(&self.schema);
24 result.push('.');
25 }
26 result.push_str(&self.name);
27 }
28 result
29 }
30 pub fn with_alias(&self, alias: Cow<'static, str>) -> Self {
31 let mut result = self.clone();
32 result.alias = alias.into();
33 result
34 }
35}
36
37impl DataSet for TableRef {
38 fn qualified_columns() -> bool
39 where
40 Self: Sized,
41 {
42 false
43 }
44 fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, buff: &mut String) {
45 writer.write_table_ref(context, buff, self)
46 }
47}
48
49impl DataSet for &TableRef {
50 fn qualified_columns() -> bool
51 where
52 Self: Sized,
53 {
54 false
55 }
56 fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, buff: &mut String) {
57 (*writer).write_table_ref(context, buff, self)
58 }
59}
60
61impl ToTokens for TableRef {
62 fn to_tokens(&self, tokens: &mut TokenStream) {
63 let name = &self.name;
64 let schema = &self.schema;
65 let alias = quote_cow(&self.alias);
66 tokens.append_all(quote! {
67 ::tank::ColumnRef {
68 name: #name,
69 schema: #schema,
70 alias: #alias,
71 }
72 });
73 }
74}
75
76#[derive(Default, Clone, PartialEq, Eq, Debug)]
77pub struct DeclareTableRef(pub TableRef);
78
79impl DataSet for DeclareTableRef {
80 fn qualified_columns() -> bool
81 where
82 Self: Sized,
83 {
84 false
85 }
86 fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, buff: &mut String) {
87 writer.write_table_ref(context, buff, &self.0)
88 }
89}
90
91impl ToTokens for DeclareTableRef {
92 fn to_tokens(&self, tokens: &mut TokenStream) {
93 let table_ref = &self.0;
94 tokens.append_all(quote!(::tank::DeclareTableRef(#table_ref)));
95 }
96}