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