11use crate :: query:: bounds:: FieldIdentifier ;
2- use crate :: query:: querybuilder:: syntax:: keyword:: Keyword ;
3- use crate :: query:: querybuilder:: syntax:: symbol:: Symbol :: Dot ;
4- use crate :: query:: querybuilder:: syntax:: tokens:: { SqlTokens , ToSqlTokens } ;
2+ use crate :: query:: querybuilder:: syntax:: tokens:: { SqlToken , SqlTokens , ToSqlTokens } ;
53
64#[ derive( Debug , Clone , Default ) ]
75pub struct ColumnRef < ' a > {
@@ -26,18 +24,10 @@ impl<'a> From<&'a str> for ColumnRef<'a> {
2624}
2725
2826impl < ' a > ToSqlTokens < ' a > for ColumnRef < ' a > {
29- fn to_tokens ( & self , out : & mut SqlTokens < ' a > ) {
30- if let Some ( table_ref) = self . table {
31- out. ident ( table_ref) ;
32- out. symbol ( Dot )
33- }
34-
35- out. ident ( self . column ) ;
36-
37- if let Some ( alias) = self . alias {
38- out. keyword ( Keyword :: As ) ;
39- out. ident ( alias) ;
40- }
27+ fn to_tokens ( & self ) -> impl IntoIterator < Item = SqlToken < ' a > > + ' a {
28+ let mut out = SqlTokens :: with_capacity ( __detail:: calculate_column_ref_capacity ( self ) ) ;
29+ __impl:: generate_column_ref_tokens ( self , & mut out) ;
30+ out
4131 }
4232}
4333
@@ -70,6 +60,9 @@ impl<'a> ColumnRef<'a> {
7060
7161mod __impl {
7262 use crate :: query:: querybuilder:: syntax:: column:: { __detail, ColumnRef } ;
63+ use crate :: query:: querybuilder:: syntax:: keyword:: Keyword ;
64+ use crate :: query:: querybuilder:: syntax:: symbol:: Symbol :: Dot ;
65+ use crate :: query:: querybuilder:: syntax:: tokens:: SqlTokens ;
7366
7467 pub ( crate ) fn column_ref_from_str_ref ( value : & str ) -> ColumnRef < ' _ > {
7568 let trimmed = value. trim ( ) ;
@@ -94,9 +87,25 @@ mod __impl {
9487 alias,
9588 }
9689 }
90+
91+ pub ( crate ) fn generate_column_ref_tokens < ' a > ( __self : & ColumnRef < ' a > , out : & mut SqlTokens < ' a > ) {
92+ if let Some ( table_ref) = __self. table {
93+ out. ident ( table_ref) ;
94+ out. symbol ( Dot )
95+ }
96+
97+ out. ident ( __self. column ) ;
98+
99+ if let Some ( alias) = __self. alias {
100+ out. keyword ( Keyword :: As ) ;
101+ out. ident ( alias) ;
102+ }
103+ }
97104}
98105
99106mod __detail {
107+ use crate :: query:: querybuilder:: syntax:: column:: ColumnRef ;
108+
100109 pub ( crate ) fn find_case_insensitive_as ( s : & str ) -> Option < usize > {
101110 let bytes = s. as_bytes ( ) ;
102111 for i in 0 ..bytes. len ( ) . saturating_sub ( 2 ) {
@@ -118,6 +127,17 @@ mod __detail {
118127 }
119128 None
120129 }
130+
131+ pub ( crate ) fn calculate_column_ref_capacity ( __self : & ColumnRef ) -> usize {
132+ let mut counter = 1 ; // at least the column name
133+ if __self. table . is_some ( ) {
134+ counter += 2 ; // table name + dot
135+ }
136+ if __self. alias . is_some ( ) {
137+ counter += 2 ; // AS + alias name
138+ }
139+ counter
140+ }
121141}
122142
123143#[ cfg( test) ]
0 commit comments