1use bmbp_rdbc_type::{RdbcIdent, RdbcValue};
2use std::collections::HashMap;
3
4use crate::{QueryWrapper, RdbcFunc};
5
6pub enum RdbcColumn {
9 Table(RdbcTableColumn),
10 Query(RdbcQueryColumn),
11 Func(RdbcFuncColumn),
12 Value(RdbcValueColumn),
13}
14
15impl RdbcColumn {
16 pub fn is_value(&self) -> bool {
17 match self {
18 RdbcColumn::Value(_) => true,
19 _ => false,
20 }
21 }
22
23 pub fn get_value(&self) -> Option<&RdbcValue> {
24 match self {
25 RdbcColumn::Value(column) => Some(column.get_name()),
26 _ => None,
27 }
28 }
29 pub fn is_query(&self) -> bool {
30 match self {
31 RdbcColumn::Query(_) => true,
32 _ => false,
33 }
34 }
35 pub fn get_query(&self) -> Option<&QueryWrapper> {
36 match self {
37 RdbcColumn::Query(column) => Some(column.get_name()),
38 _ => None,
39 }
40 }
41}
42
43impl From<RdbcTableColumn> for RdbcColumn {
44 fn from(column: RdbcTableColumn) -> Self {
45 RdbcColumn::Table(column)
46 }
47}
48
49impl From<RdbcQueryColumn> for RdbcColumn {
50 fn from(column: RdbcQueryColumn) -> Self {
51 RdbcColumn::Query(column)
52 }
53}
54
55impl From<RdbcFuncColumn> for RdbcColumn {
56 fn from(column: RdbcFuncColumn) -> Self {
57 RdbcColumn::Func(column)
58 }
59}
60
61impl From<RdbcValueColumn> for RdbcColumn {
62 fn from(column: RdbcValueColumn) -> Self {
63 RdbcColumn::Value(column)
64 }
65}
66
67impl<T> From<T> for RdbcColumn
69where
70 T: RdbcIdent,
71{
72 fn from(value: T) -> Self {
73 RdbcColumn::Table(RdbcTableColumn::column(value.get_ident()))
74 }
75}
76
77impl RdbcColumn {
78 pub fn column<T>(name: T) -> RdbcColumn
79 where
80 T: ToString,
81 {
82 RdbcColumn::Table(RdbcTableColumn::column(name))
83 }
84 pub fn column_as_alias<T, E>(name: T, alias: E) -> RdbcColumn
85 where
86 T: ToString,
87 E: ToString,
88 {
89 RdbcColumn::Table(RdbcTableColumn::column_as_alias(name, alias))
90 }
91 pub fn table_column<T, C>(table: T, name: C) -> RdbcColumn
92 where
93 T: ToString,
94 C: ToString,
95 {
96 RdbcColumn::Table(RdbcTableColumn::table_column(table, name))
97 }
98 pub fn table_column_as_alias<ST, SC, SA>(table: ST, column: SC, alias: SA) -> RdbcColumn
99 where
100 ST: ToString,
101 SC: ToString,
102 SA: ToString,
103 {
104 RdbcColumn::Table(RdbcTableColumn::table_column_as_alias(table, column, alias))
105 }
106
107 pub fn schema_table_column<S, T, C>(schema: S, table: T, name: C) -> RdbcColumn
108 where
109 S: ToString,
110 T: ToString,
111 C: ToString,
112 {
113 RdbcColumn::Table(RdbcTableColumn::schema_table_column(schema, table, name))
114 }
115 pub fn schema_table_column_as_alias<S, T, C, A>(
116 schema: S,
117 table: T,
118 name: C,
119 alias: A,
120 ) -> RdbcColumn
121 where
122 S: ToString,
123 T: ToString,
124 C: ToString,
125 A: ToString,
126 {
127 RdbcColumn::Table(RdbcTableColumn::schema_table_column_as_alias(
128 schema, table, name, alias,
129 ))
130 }
131 pub fn rdbc_value(value: RdbcValue) -> RdbcColumn {
132 RdbcColumn::Value(RdbcValueColumn::rdbc_value(value))
133 }
134
135 pub fn rdbc_value_alias<T>(value: RdbcValue, alias: T) -> RdbcColumn
136 where
137 T: ToString,
138 {
139 RdbcColumn::Value(RdbcValueColumn::rdbc_value_alias(value, alias))
140 }
141 pub fn raw_value<T>(value: T) -> RdbcColumn
142 where
143 T: ToString,
144 {
145 RdbcColumn::Value(RdbcValueColumn::raw_value(value))
146 }
147 pub fn raw_value_alias<T>(value: T, alias: T) -> RdbcColumn
148 where
149 T: ToString,
150 {
151 RdbcColumn::Value(RdbcValueColumn::raw_value_alias(value, alias))
152 }
153
154 pub fn string_value<T>(value: T) -> RdbcColumn
155 where
156 T: ToString,
157 {
158 RdbcColumn::Value(RdbcValueColumn::string_value(value))
159 }
160 pub fn string_value_alias<T>(value: T, alias: T) -> RdbcColumn
161 where
162 T: ToString,
163 {
164 RdbcColumn::Value(RdbcValueColumn::string_value_alias(value, alias))
165 }
166 pub fn query(query: QueryWrapper) -> RdbcColumn {
167 RdbcColumn::Query(RdbcQueryColumn::query(query))
168 }
169 pub fn query_alias<T>(query: QueryWrapper, alias: T) -> RdbcColumn
170 where
171 T: ToString,
172 {
173 RdbcColumn::Query(RdbcQueryColumn::query_alias(query, alias))
174 }
175
176 pub fn concat_split(columns: Vec<RdbcColumn>, split_: Option<String>) -> RdbcColumn {
177 RdbcColumn::Func(RdbcFuncColumn::concat_split(columns, split_))
178 }
179 pub fn concat(columns: Vec<RdbcColumn>) -> RdbcColumn {
180 RdbcColumn::Func(RdbcFuncColumn::concat(columns))
181 }
182 pub fn replace<C, OV, NV>(column: C, old_value: OV, new_value: NV) -> RdbcColumn
183 where
184 RdbcTableColumn: From<C>,
185 OV: ToString,
186 NV: ToString,
187 {
188 RdbcColumn::Func(RdbcFuncColumn::replace(
189 RdbcTableColumn::from(column),
190 old_value.to_string(),
191 new_value.to_string(),
192 ))
193 }
194}
195
196pub struct RdbcTableColumn {
197 schema_: Option<String>,
198 table_: Option<String>,
199 name_: String,
200 alias_: Option<String>,
201}
202
203impl RdbcTableColumn {
204 pub fn get_schema(&self) -> Option<&String> {
205 self.schema_.as_ref()
206 }
207 pub fn get_table(&self) -> Option<&String> {
208 self.table_.as_ref()
209 }
210 pub fn get_name(&self) -> &String {
211 &self.name_
212 }
213 pub fn get_alias(&self) -> Option<&String> {
214 self.alias_.as_ref()
215 }
216}
217
218impl RdbcTableColumn {
219 fn column<T>(name: T) -> RdbcTableColumn
220 where
221 T: ToString,
222 {
223 RdbcTableColumn {
224 schema_: None,
225 table_: None,
226 name_: name.to_string(),
227 alias_: None,
228 }
229 }
230 fn column_as_alias<T, E>(name: T, alias: E) -> RdbcTableColumn
231 where
232 T: ToString,
233 E: ToString,
234 {
235 RdbcTableColumn {
236 schema_: None,
237 table_: None,
238 name_: name.to_string(),
239 alias_: Some(alias.to_string()),
240 }
241 }
242 fn table_column<T, C>(table: T, name: C) -> RdbcTableColumn
243 where
244 T: ToString,
245 C: ToString,
246 {
247 RdbcTableColumn {
248 schema_: None,
249 table_: Some(table.to_string()),
250 name_: name.to_string(),
251 alias_: None,
252 }
253 }
254 fn table_column_as_alias<ST, SC, SA>(table: ST, name: SC, alias: SA) -> RdbcTableColumn
255 where
256 ST: ToString,
257 SC: ToString,
258 SA: ToString,
259 {
260 RdbcTableColumn {
261 schema_: None,
262 table_: Some(table.to_string()),
263 name_: name.to_string(),
264 alias_: Some(alias.to_string()),
265 }
266 }
267 fn schema_table_column<S, T, C>(schema: S, table: T, name: C) -> RdbcTableColumn
268 where
269 S: ToString,
270 T: ToString,
271 C: ToString,
272 {
273 RdbcTableColumn {
274 schema_: Some(schema.to_string()),
275 table_: Some(table.to_string()),
276 name_: name.to_string(),
277 alias_: None,
278 }
279 }
280 fn schema_table_column_as_alias<S, T, C, A>(
281 schema: S,
282 table: T,
283 name: C,
284 alias: A,
285 ) -> RdbcTableColumn
286 where
287 S: ToString,
288 T: ToString,
289 C: ToString,
290 A: ToString,
291 {
292 RdbcTableColumn {
293 schema_: Some(schema.to_string()),
294 table_: Some(table.to_string()),
295 name_: name.to_string(),
296 alias_: Some(alias.to_string()),
297 }
298 }
299}
300
301impl<T> From<T> for RdbcTableColumn
302where
303 T: ToString,
304{
305 fn from(value: T) -> Self {
306 RdbcTableColumn::column(value)
307 }
308}
309
310pub struct RdbcValueColumn {
311 name_: RdbcValue,
312 alias_: Option<String>,
313}
314
315impl RdbcValueColumn {
316 pub fn get_name(&self) -> &RdbcValue {
317 &self.name_
318 }
319 pub fn get_alias(&self) -> Option<&String> {
320 self.alias_.as_ref()
321 }
322}
323
324impl RdbcValueColumn {
325 pub fn rdbc_value(value: RdbcValue) -> RdbcValueColumn {
326 RdbcValueColumn {
327 name_: value,
328 alias_: None,
329 }
330 }
331 pub fn rdbc_value_alias<T>(value: RdbcValue, alias: T) -> RdbcValueColumn
332 where
333 T: ToString,
334 {
335 RdbcValueColumn {
336 name_: value,
337 alias_: Some(alias.to_string()),
338 }
339 }
340 fn raw_value<T>(value: T) -> RdbcValueColumn
341 where
342 T: ToString,
343 {
344 RdbcValueColumn {
345 name_: RdbcValue::String(value.to_string()),
346 alias_: None,
347 }
348 }
349 fn raw_value_alias<T>(value: T, alias: T) -> RdbcValueColumn
350 where
351 T: ToString,
352 {
353 RdbcValueColumn {
354 name_: RdbcValue::String(value.to_string()),
355 alias_: Some(alias.to_string()),
356 }
357 }
358
359 fn string_value<T>(value: T) -> RdbcValueColumn
360 where
361 T: ToString,
362 {
363 RdbcValueColumn {
364 name_: RdbcValue::String(format!("'{}'", value.to_string())),
365 alias_: None,
366 }
367 }
368 fn string_value_alias<T>(value: T, alias: T) -> RdbcValueColumn
369 where
370 T: ToString,
371 {
372 RdbcValueColumn {
373 name_: RdbcValue::String(format!("'{}'", value.to_string())),
374 alias_: Some(alias.to_string()),
375 }
376 }
377}
378
379pub struct RdbcFuncColumn {
380 columns_: RdbcFunc,
381 alias_: Option<String>,
382}
383
384impl RdbcFuncColumn {
385 pub fn get_name(&self) -> &RdbcFunc {
386 &self.columns_
387 }
388 pub fn get_alias(&self) -> Option<&String> {
389 self.alias_.as_ref()
390 }
391}
392
393impl RdbcFuncColumn {
394 fn concat_split(columns: Vec<RdbcColumn>, split_: Option<String>) -> RdbcFuncColumn {
395 RdbcFuncColumn {
396 columns_: RdbcFunc::concat_split(columns, split_),
397 alias_: None,
398 }
399 }
400 fn concat(columns: Vec<RdbcColumn>) -> RdbcFuncColumn {
401 RdbcFuncColumn {
402 columns_: RdbcFunc::concat(columns),
403 alias_: None,
404 }
405 }
406 fn replace(column: RdbcTableColumn, old_value: String, new_value: String) -> RdbcFuncColumn {
407 RdbcFuncColumn {
408 columns_: RdbcFunc::replace(column, old_value, new_value),
409 alias_: None,
410 }
411 }
412}
413
414pub struct RdbcQueryColumn {
415 name_: QueryWrapper,
416 alias_: Option<String>,
417}
418
419impl RdbcQueryColumn {
420 pub fn get_name(&self) -> &QueryWrapper {
421 &self.name_
422 }
423 pub fn get_alias(&self) -> Option<&String> {
424 self.alias_.as_ref()
425 }
426}
427
428impl RdbcQueryColumn {
429 fn query(query: QueryWrapper) -> RdbcQueryColumn {
430 RdbcQueryColumn {
431 name_: query,
432 alias_: None,
433 }
434 }
435 fn query_alias<T>(query: QueryWrapper, alias: T) -> RdbcQueryColumn
436 where
437 T: ToString,
438 {
439 RdbcQueryColumn {
440 name_: query,
441 alias_: Some(alias.to_string()),
442 }
443 }
444}
445
446pub enum RdbcTableInner {
447 Table(RdbcSchemaTable),
448 Query(RdbcQueryTable),
449}
450
451impl RdbcTableInner {
452 pub fn get_join(&self) -> Option<&RdbcTableJoinType> {
453 match self {
454 RdbcTableInner::Table(table) => table.get_join(),
455 RdbcTableInner::Query(query) => query.get_join(),
456 }
457 }
458 pub fn get_filter(&self) -> Option<&QueryFilter> {
459 match self {
460 RdbcTableInner::Table(table) => table.get_filter(),
461 RdbcTableInner::Query(query) => query.get_filter(),
462 }
463 }
464 pub fn get_filter_mut(&mut self) -> &mut QueryFilter {
465 match self {
466 RdbcTableInner::Table(table) => table.get_filter_mut(),
467 RdbcTableInner::Query(query) => query.get_filter_mut(),
468 }
469 }
470 pub fn set_filter(&mut self, filter: QueryFilter) -> &mut Self {
471 let _ = match self {
472 RdbcTableInner::Table(table) => {
473 let _ = table.set_filter(filter);
474 }
475 RdbcTableInner::Query(query) => {
476 let _ = query.set_filter(filter);
477 }
478 };
479 self
480 }
481}
482
483impl RdbcTableInner {
484 pub(crate) fn table<T>(table: T) -> RdbcTableInner
485 where
486 T: ToString,
487 {
488 RdbcTableInner::Table(RdbcSchemaTable::table(table))
489 }
490 pub fn table_alias<T, V>(table: T, alias: V) -> RdbcTableInner
491 where
492 T: ToString,
493 V: ToString,
494 {
495 RdbcTableInner::Table(RdbcSchemaTable::table_alias(table, alias))
496 }
497 pub fn schema_table<T>(schema: T, table: T) -> RdbcTableInner
498 where
499 T: ToString,
500 {
501 RdbcTableInner::Table(RdbcSchemaTable::schema_table(schema, table))
502 }
503 pub fn schema_table_alias<SS, ST, SA>(schema: SS, table: ST, alias: SA) -> RdbcTableInner
504 where
505 SS: ToString,
506 ST: ToString,
507 SA: ToString,
508 {
509 RdbcTableInner::Table(RdbcSchemaTable::schema_table_alias(schema, table, alias))
510 }
511
512 pub fn temp_table(table: QueryWrapper) -> RdbcTableInner {
513 RdbcTableInner::Query(RdbcQueryTable::query(table))
514 }
515 pub fn temp_table_alias<T>(table: QueryWrapper, alias: T) -> RdbcTableInner
516 where
517 T: ToString,
518 {
519 RdbcTableInner::Query(RdbcQueryTable::query_alias(table, alias))
520 }
521 pub fn join_table<T>(table: T, left: RdbcTableJoinType) -> RdbcTableInner
522 where
523 T: ToString,
524 {
525 RdbcTableInner::Table(RdbcSchemaTable::join_table(table, left))
526 }
527 pub fn join_table_alias<T, A>(table: T, alias: A, left: RdbcTableJoinType) -> RdbcTableInner
528 where
529 T: ToString,
530 A: ToString,
531 {
532 RdbcTableInner::Table(RdbcSchemaTable::join_table_alias(table, alias, left))
533 }
534 pub fn join_schema_table<S, T>(schema: S, table: T, left: RdbcTableJoinType) -> RdbcTableInner
535 where
536 S: ToString,
537 T: ToString,
538 {
539 RdbcTableInner::Table(RdbcSchemaTable::join_schema_table(schema, table, left))
540 }
541 pub fn join_schema_table_alias<S, T, A>(
542 schema: S,
543 table: T,
544 alias: A,
545 left: RdbcTableJoinType,
546 ) -> RdbcTableInner
547 where
548 S: ToString,
549 T: ToString,
550 A: ToString,
551 {
552 RdbcTableInner::Table(RdbcSchemaTable::join_schema_table_alias(
553 schema, table, alias, left,
554 ))
555 }
556 pub(crate) fn join_temp_table(
557 table: QueryWrapper,
558 join_type: RdbcTableJoinType,
559 ) -> RdbcTableInner {
560 RdbcTableInner::Query(RdbcQueryTable::join_table(table, join_type))
561 }
562 pub(crate) fn join_temp_table_alias<SA>(
563 table: QueryWrapper,
564 alias: SA,
565 join_type: RdbcTableJoinType,
566 ) -> RdbcTableInner
567 where
568 SA: ToString,
569 {
570 RdbcTableInner::Query(RdbcQueryTable::join_table_alias(table, alias, join_type))
571 }
572}
573
574impl RdbcTableInner {
575 pub fn or(&mut self) -> &mut Self {
576 match self {
577 RdbcTableInner::Table(ref mut table) => {
578 table.or();
579 }
580 RdbcTableInner::Query(ref mut table) => {
581 table.or();
582 }
583 }
584 self
585 }
586
587 pub fn on_eq<T, V, E, F>(&mut self, t1: T, c1: V, t2: E, c2: F) -> &mut Self
588 where
589 T: ToString,
590 E: ToString,
591 V: ToString,
592 F: ToString,
593 {
594 match self {
595 RdbcTableInner::Table(ref mut table) => {
596 table.eq_column(simple_column(t1, c1), simple_column(t2, c2));
597 }
598 RdbcTableInner::Query(ref mut table) => {
599 table.eq_column(simple_column(t1, c1), simple_column(t2, c2));
600 }
601 }
602 self
603 }
604
605 pub fn on_eq_col<RT, RC>(&mut self, column1: RT, column2: RC) -> &mut Self
606 where
607 RdbcColumn: From<RT>,
608 RdbcColumn: From<RC>,
609 {
610 match self {
611 RdbcTableInner::Table(ref mut table) => {
612 table.eq_column(RdbcColumn::from(column1), RdbcColumn::from(column2));
613 }
614 RdbcTableInner::Query(ref mut table) => {
615 table.eq_column(RdbcColumn::from(column1), RdbcColumn::from(column2));
616 }
617 }
618 self
619 }
620}
621
622pub enum RdbcTableJoinType {
623 Left,
624 Right,
625 Inner,
626 Full,
627}
628
629pub struct RdbcSchemaTable {
630 schema_: Option<String>,
631 name_: String,
632 alias_: Option<String>,
633 join_: Option<RdbcTableJoinType>,
634 filter_: Option<QueryFilter>,
635 params_: Option<HashMap<String, RdbcValue>>,
636}
637
638impl RdbcSchemaTable {
639 pub fn get_schema(&self) -> Option<&String> {
640 self.schema_.as_ref()
641 }
642 pub fn get_name(&self) -> &String {
643 &self.name_
644 }
645 pub fn get_alias(&self) -> Option<&String> {
646 self.alias_.as_ref()
647 }
648 pub fn get_join(&self) -> Option<&RdbcTableJoinType> {
649 self.join_.as_ref()
650 }
651 pub fn get_filter(&self) -> Option<&QueryFilter> {
652 self.filter_.as_ref()
653 }
654
655 pub fn get_mut_params(&mut self) -> Option<&mut HashMap<String, RdbcValue>> {
656 self.params_.as_mut()
657 }
658}
659
660impl RdbcSchemaTable {
661 pub fn table<T>(table: T) -> RdbcSchemaTable
662 where
663 T: ToString,
664 {
665 RdbcSchemaTable {
666 schema_: None,
667 name_: table.to_string(),
668 alias_: None,
669 join_: None,
670 filter_: Some(QueryFilter::new()),
671 params_: None,
672 }
673 }
674 fn table_alias<T, V>(table: T, alias: V) -> RdbcSchemaTable
675 where
676 T: ToString,
677 V: ToString,
678 {
679 RdbcSchemaTable {
680 schema_: None,
681 name_: table.to_string(),
682 alias_: Some(alias.to_string()),
683 join_: None,
684 filter_: Some(QueryFilter::new()),
685 params_: None,
686 }
687 }
688 fn schema_table<T>(schema: T, table: T) -> RdbcSchemaTable
689 where
690 T: ToString,
691 {
692 RdbcSchemaTable {
693 schema_: Some(schema.to_string()),
694 name_: table.to_string(),
695 alias_: None,
696 join_: None,
697 filter_: Some(QueryFilter::new()),
698 params_: None,
699 }
700 }
701 pub fn schema_table_alias<SS, ST, SA>(schema: SS, table: ST, alias: SA) -> RdbcSchemaTable
702 where
703 SS: ToString,
704 ST: ToString,
705 SA: ToString,
706 {
707 RdbcSchemaTable {
708 schema_: Some(schema.to_string()),
709 name_: table.to_string(),
710 alias_: Some(alias.to_string()),
711 join_: None,
712 filter_: Some(QueryFilter::new()),
713 params_: None,
714 }
715 }
716 pub fn join_table<T>(table: T, join_type: RdbcTableJoinType) -> RdbcSchemaTable
717 where
718 T: ToString,
719 {
720 RdbcSchemaTable {
721 schema_: None,
722 name_: table.to_string(),
723 alias_: None,
724 join_: Some(join_type),
725 filter_: Some(QueryFilter::new()),
726 params_: None,
727 }
728 }
729 pub fn join_table_alias<T, A>(
730 table: T,
731 alias: A,
732 join_type: RdbcTableJoinType,
733 ) -> RdbcSchemaTable
734 where
735 T: ToString,
736 A: ToString,
737 {
738 RdbcSchemaTable {
739 schema_: None,
740 name_: table.to_string(),
741 alias_: Some(alias.to_string()),
742 join_: Some(join_type),
743 filter_: Some(QueryFilter::new()),
744 params_: None,
745 }
746 }
747 fn join_schema_table<S, T>(schmea: S, table: T, join_type: RdbcTableJoinType) -> RdbcSchemaTable
748 where
749 S: ToString,
750 T: ToString,
751 {
752 RdbcSchemaTable {
753 schema_: Some(schmea.to_string()),
754 name_: table.to_string(),
755 alias_: None,
756 join_: Some(join_type),
757 filter_: Some(QueryFilter::new()),
758 params_: None,
759 }
760 }
761
762 pub fn join_schema_table_alias<S, T, A>(
763 schmea: S,
764 table: T,
765 alias: A,
766 join_type: RdbcTableJoinType,
767 ) -> RdbcSchemaTable
768 where
769 S: ToString,
770 T: ToString,
771 A: ToString,
772 {
773 RdbcSchemaTable {
774 schema_: Some(schmea.to_string()),
775 name_: table.to_string(),
776 alias_: Some(alias.to_string()),
777 join_: Some(join_type),
778 filter_: Some(QueryFilter::new()),
779 params_: None,
780 }
781 }
782}
783
784impl RdbcSchemaTable {
785 fn set_filter(&mut self, filter: QueryFilter) -> &mut Self {
786 self.filter_ = Some(filter);
787 self
788 }
789 fn get_filter_mut(&mut self) -> &mut QueryFilter {
790 if self.filter_.is_none() {
791 self.filter_ = Some(QueryFilter::new());
792 }
793 self.filter_.as_mut().unwrap()
794 }
795 fn create_filter(&mut self, concat: RdbcConcatType) -> &mut Self {
796 let filter = self.filter_.take().unwrap();
797 let new_filter = QueryFilter::concat_with_filter(concat, filter);
798 self.filter_ = Some(new_filter);
799 self
800 }
801 pub fn left_join(&mut self) -> &mut Self {
802 self.join_ = Some(RdbcTableJoinType::Left);
803 self
804 }
805 pub fn eq<RC, RV>(&mut self, column: RC, value: RV) -> &mut Self
806 where
807 RdbcColumn: From<RC>,
808 RdbcValue: From<RV>,
809 {
810 self.filter_
811 .as_mut()
812 .unwrap()
813 .eq_(RdbcColumn::from(column), RdbcValue::from(value));
814 self
815 }
816 pub fn eq_column(&mut self, col: RdbcColumn, val: RdbcColumn) -> &mut Self {
817 self.filter_.as_mut().unwrap().eq_column(col, val);
818 self
819 }
820 pub fn or(&mut self) -> &mut Self {
821 self.create_filter(RdbcConcatType::Or);
822 self
823 }
824 pub fn and(&mut self) -> &mut Self {
825 self.create_filter(RdbcConcatType::And);
826 self
827 }
828}
829
830pub struct RdbcQueryTable {
831 name_: QueryWrapper,
832 alias_: Option<String>,
833 join_: Option<RdbcTableJoinType>,
834 filter_: Option<QueryFilter>,
835}
836
837impl RdbcQueryTable {
838 pub fn get_name(&self) -> &QueryWrapper {
839 &self.name_
840 }
841 pub fn get_alias(&self) -> Option<&String> {
842 self.alias_.as_ref()
843 }
844 pub fn get_join(&self) -> Option<&RdbcTableJoinType> {
845 self.join_.as_ref()
846 }
847 pub fn get_filter(&self) -> Option<&QueryFilter> {
848 self.filter_.as_ref()
849 }
850 pub fn get_filter_mut(&mut self) -> &mut QueryFilter {
851 if self.filter_.is_none() {
852 self.filter_ = Some(QueryFilter::new());
853 }
854 self.filter_.as_mut().unwrap()
855 }
856 fn set_filter(&mut self, filter: QueryFilter) -> &mut Self {
857 self.filter_ = Some(filter);
858 self
859 }
860}
861
862impl RdbcQueryTable {
863 fn query(table: QueryWrapper) -> RdbcQueryTable {
864 RdbcQueryTable {
865 name_: table,
866 alias_: None,
867 join_: None,
868 filter_: None,
869 }
870 }
871 fn query_alias<T>(table: QueryWrapper, alias: T) -> RdbcQueryTable
872 where
873 T: ToString,
874 {
875 RdbcQueryTable {
876 name_: table,
877 alias_: Some(alias.to_string()),
878 join_: None,
879 filter_: None,
880 }
881 }
882
883 pub fn eq_column(&mut self, col: RdbcColumn, val: RdbcColumn) -> &mut Self {
884 self.filter_.as_mut().unwrap().eq_column(col, val);
885 self
886 }
887 fn join_table(table: QueryWrapper, join_type: RdbcTableJoinType) -> RdbcQueryTable {
888 RdbcQueryTable {
889 name_: table,
890 alias_: None,
891 join_: Some(join_type),
892 filter_: None,
893 }
894 }
895 fn join_table_alias<A>(
896 table: QueryWrapper,
897 alias: A,
898 join_type: RdbcTableJoinType,
899 ) -> RdbcQueryTable
900 where
901 A: ToString,
902 {
903 RdbcQueryTable {
904 name_: table,
905 alias_: Some(alias.to_string()),
906 join_: Some(join_type),
907 filter_: None,
908 }
909 }
910 fn or(&mut self) -> &mut Self {
912 self
913 }
914}
915
916pub enum RdbcConcatType {
917 And,
918 Or,
919}
920
921pub struct QueryFilter {
923 concat_: RdbcConcatType,
924 item_: Vec<QueryFilterItem>,
925 params_: Option<HashMap<String, RdbcValue>>,
926}
927impl QueryFilter {
928 pub fn get_concat(&self) -> &RdbcConcatType {
929 &self.concat_
930 }
931 pub fn get_item(&self) -> &Vec<QueryFilterItem> {
932 &self.item_
933 }
934 pub fn get_params(&self) -> Option<&HashMap<String, RdbcValue>> {
935 self.params_.as_ref()
936 }
937
938 pub fn add_filter(&mut self, filter: QueryFilter) -> &mut Self {
939 self.item_.push(QueryFilterItem::Filter(filter));
940 self
941 }
942 pub(crate) fn eq_(&mut self, column: RdbcColumn, value: RdbcValue) -> &mut Self {
943 self.item_.push(QueryFilterItem::eq_(column, value));
944 self
945 }
946 pub fn eq_column<RC, VC>(&mut self, column: RC, value: VC) -> &mut Self
947 where
948 RdbcColumn: From<RC>,
949 RdbcColumn: From<VC>,
950 {
951 self.item_.push(QueryFilterItem::eq_column(
952 RdbcColumn::from(column),
953 RdbcColumn::from(value),
954 ));
955 self
956 }
957 pub(crate) fn ne_(&mut self, column: RdbcColumn, value: RdbcValue) -> &mut Self {
958 self.item_.push(QueryFilterItem::ne_(column, value));
959 self
960 }
961 pub(crate) fn ne_column(&mut self, column: RdbcColumn, value: RdbcColumn) -> &mut Self {
962 self.item_.push(QueryFilterItem::ne_column(column, value));
963 self
964 }
965 pub(crate) fn ge_(&mut self, column: RdbcColumn, value: RdbcValue) -> &mut Self {
966 self.item_.push(QueryFilterItem::ge_(column, value));
967 self
968 }
969 pub(crate) fn ge_column(&mut self, column: RdbcColumn, value: RdbcColumn) -> &mut Self {
970 self.item_.push(QueryFilterItem::ge_column(column, value));
971 self
972 }
973 pub(crate) fn gt_(&mut self, column: RdbcColumn, value: RdbcValue) -> &mut Self {
974 self.item_.push(QueryFilterItem::gt_(column, value));
975 self
976 }
977 pub(crate) fn gt_column(&mut self, column: RdbcColumn, value: RdbcColumn) -> &mut Self {
978 self.item_.push(QueryFilterItem::gt_column(column, value));
979 self
980 }
981 pub(crate) fn le_(&mut self, column: RdbcColumn, value: RdbcValue) -> &mut Self {
982 self.item_.push(QueryFilterItem::le_(column, value));
983 self
984 }
985 pub(crate) fn le_column(&mut self, column: RdbcColumn, value: RdbcColumn) -> &mut Self {
986 self.item_.push(QueryFilterItem::le_column(column, value));
987 self
988 }
989 pub(crate) fn lt_(&mut self, column: RdbcColumn, value: RdbcValue) -> &mut Self {
990 self.item_.push(QueryFilterItem::lt_(column, value));
991 self
992 }
993 pub(crate) fn lt_column(&mut self, column: RdbcColumn, value: RdbcColumn) -> &mut Self {
994 self.item_.push(QueryFilterItem::lt_column(column, value));
995 self
996 }
997 pub(crate) fn null_(&mut self, column: RdbcColumn) -> &mut Self {
998 self.item_.push(QueryFilterItem::null_(column));
999 self
1000 }
1001 pub(crate) fn not_null_(&mut self, column: RdbcColumn) -> &mut Self {
1002 self.item_.push(QueryFilterItem::not_null_(column));
1003 self
1004 }
1005 pub fn between_(
1006 &mut self,
1007 column: RdbcColumn,
1008 value_start: RdbcValue,
1009 value_end: RdbcValue,
1010 ) -> &mut Self {
1011 self.item_
1012 .push(QueryFilterItem::between_(column, value_start, value_end));
1013 self
1014 }
1015 pub fn not_between_(
1016 &mut self,
1017 column: RdbcColumn,
1018 value_start: RdbcValue,
1019 value_end: RdbcValue,
1020 ) -> &mut Self {
1021 self.item_.push(QueryFilterItem::not_between_(
1022 column,
1023 value_start,
1024 value_end,
1025 ));
1026 self
1027 }
1028 pub fn like_(&mut self, column: RdbcColumn, value: RdbcValue) -> &mut Self {
1029 self.item_.push(QueryFilterItem::like_(column, value));
1030 self
1031 }
1032 pub fn like_left_(&mut self, column: RdbcColumn, value: RdbcValue) -> &mut Self {
1033 self.item_.push(QueryFilterItem::like_left_(column, value));
1034 self
1035 }
1036 pub fn like_right_(&mut self, column: RdbcColumn, value: RdbcValue) -> &mut Self {
1037 self.item_.push(QueryFilterItem::like_right_(column, value));
1038 self
1039 }
1040 pub fn not_like_(&mut self, column: RdbcColumn, value: RdbcValue) -> &mut Self {
1041 self.item_.push(QueryFilterItem::not_like_(column, value));
1042 self
1043 }
1044 pub fn not_like_left_(&mut self, column: RdbcColumn, value: RdbcValue) -> &mut Self {
1045 self.item_
1046 .push(QueryFilterItem::not_like_left_(column, value));
1047 self
1048 }
1049 pub fn not_like_right_(&mut self, column: RdbcColumn, value: RdbcValue) -> &mut Self {
1050 self.item_
1051 .push(QueryFilterItem::not_like_right_(column, value));
1052 self
1053 }
1054 pub fn in_v_<RC, RV>(&mut self, column: RC, value: Vec<RV>) -> &mut Self
1055 where
1056 RdbcColumn: From<RC>,
1057 RdbcValue: From<RV>,
1058 {
1059 let rc = RdbcColumn::from(column);
1060 let rv: Vec<RdbcValue> = value.into_iter().map(|v| RdbcValue::from(v)).collect();
1061 self.item_.push(QueryFilterItem::in_v(rc, rv));
1062 self
1063 }
1064 pub fn in_v_s_<RC, RV>(&mut self, column: RC, value: &[RV]) -> &mut Self
1065 where
1066 RdbcColumn: From<RC>,
1067 RdbcValue: for<'a> From<&'a RV>,
1068 {
1069 let rc = RdbcColumn::from(column);
1070 let rv = value.into_iter().map(|v| RdbcValue::from(v)).collect();
1071 self.item_.push(QueryFilterItem::in_v(rc, rv));
1072 self
1073 }
1074 pub fn in_v(&mut self, column: RdbcColumn, value: Vec<RdbcValue>) -> &mut Self {
1075 self.item_.push(QueryFilterItem::in_v(column, value));
1076 self
1077 }
1078
1079 pub fn in_v_slice(&mut self, column: RdbcColumn, value: &[RdbcValue]) -> &mut Self {
1080 let rv: Vec<RdbcValue> = value.into_iter().map(|v| v.clone()).collect();
1081 self.item_.push(QueryFilterItem::in_v(column, rv));
1082 self
1083 }
1084 pub fn in_query(&mut self, column: RdbcColumn, value: QueryWrapper) -> &mut Self {
1085 self.item_.push(QueryFilterItem::in_query(column, value));
1086 self
1087 }
1088 pub fn not_in_v_<RC, RV>(&mut self, column: RC, value: Vec<RV>) -> &mut Self
1089 where
1090 RdbcColumn: From<RC>,
1091 RdbcValue: From<RV>,
1092 {
1093 let rc = RdbcColumn::from(column);
1094 let rv: Vec<RdbcValue> = value.into_iter().map(|v| RdbcValue::from(v)).collect();
1095 self.item_.push(QueryFilterItem::not_in_v(rc, rv));
1096 self
1097 }
1098 pub fn not_in_v_s_<RC, RV>(&mut self, column: RC, value: &[RV]) -> &mut Self
1099 where
1100 RdbcColumn: From<RC>,
1101 RdbcValue: for<'a> From<&'a RV>,
1102 {
1103 let rc = RdbcColumn::from(column);
1104 let rv: Vec<RdbcValue> = value.into_iter().map(|v| RdbcValue::from(v)).collect();
1105 self.item_.push(QueryFilterItem::not_in_v(rc, rv));
1106 self
1107 }
1108 pub fn not_in_v(&mut self, column: RdbcColumn, value: Vec<RdbcValue>) -> &mut Self {
1109 self.item_.push(QueryFilterItem::not_in_v(column, value));
1110 self
1111 }
1112
1113 pub fn not_in_v_slice(&mut self, column: RdbcColumn, value: &[RdbcValue]) -> &mut Self {
1114 let rv: Vec<RdbcValue> = value.into_iter().map(|v| v.clone()).collect();
1115 self.item_.push(QueryFilterItem::not_in_v(column, rv));
1116 self
1117 }
1118
1119 pub fn not_in_query(&mut self, column: RdbcColumn, value: QueryWrapper) -> &mut Self {
1120 self.item_
1121 .push(QueryFilterItem::not_in_query(column, value));
1122 self
1123 }
1124 pub fn exists_(&mut self, column: RdbcColumn, value: QueryWrapper) -> &mut Self {
1125 self.item_.push(QueryFilterItem::exists_(column, value));
1126 self
1127 }
1128 pub fn not_exists_(&mut self, column: RdbcColumn, value: QueryWrapper) -> &mut Self {
1129 self.item_.push(QueryFilterItem::not_exists_(column, value));
1130 self
1131 }
1132 pub fn new() -> QueryFilter {
1133 QueryFilter {
1134 concat_: RdbcConcatType::And,
1135 item_: vec![],
1136 params_: None,
1137 }
1138 }
1139 pub fn concat(concat: RdbcConcatType) -> QueryFilter {
1140 QueryFilter {
1141 concat_: concat,
1142 item_: vec![],
1143 params_: None,
1144 }
1145 }
1146 pub fn concat_with_filter(concat: RdbcConcatType, filter: QueryFilter) -> QueryFilter {
1147 QueryFilter {
1148 concat_: concat,
1149 item_: vec![QueryFilterItem::filter(filter)],
1150 params_: None,
1151 }
1152 }
1153}
1154
1155pub enum QueryFilterItem {
1156 Value(RdbcValueFilterItem),
1157 Column(RdbcColumnFilterItem),
1158 Filter(QueryFilter),
1159 Query(RdbcQueryFilterItem),
1160}
1161
1162impl QueryFilterItem {
1163 fn filter(filter: QueryFilter) -> QueryFilterItem {
1164 QueryFilterItem::Filter(filter)
1165 }
1166}
1167
1168impl QueryFilterItem {
1169 pub(crate) fn eq_(column: RdbcColumn, value: RdbcValue) -> QueryFilterItem {
1170 QueryFilterItem::Value(RdbcValueFilterItem::eq_(column, value))
1171 }
1172 pub fn eq_column(column: RdbcColumn, value: RdbcColumn) -> QueryFilterItem {
1173 QueryFilterItem::Column(RdbcColumnFilterItem::eq_column(column, value))
1174 }
1175 pub(crate) fn ne_(column: RdbcColumn, value: RdbcValue) -> QueryFilterItem {
1176 QueryFilterItem::Value(RdbcValueFilterItem::ne_(column, value))
1177 }
1178 pub fn ne_column(column: RdbcColumn, value: RdbcColumn) -> QueryFilterItem {
1179 QueryFilterItem::Column(RdbcColumnFilterItem::ne_column(column, value))
1180 }
1181 pub(crate) fn ge_(column: RdbcColumn, value: RdbcValue) -> QueryFilterItem {
1182 QueryFilterItem::Value(RdbcValueFilterItem::ge_(column, value))
1183 }
1184 pub fn ge_column(column: RdbcColumn, value: RdbcColumn) -> QueryFilterItem {
1185 QueryFilterItem::Column(RdbcColumnFilterItem::ge_column(column, value))
1186 }
1187 pub(crate) fn gt_(column: RdbcColumn, value: RdbcValue) -> QueryFilterItem {
1188 QueryFilterItem::Value(RdbcValueFilterItem::gt_(column, value))
1189 }
1190 pub fn gt_column(column: RdbcColumn, value: RdbcColumn) -> QueryFilterItem {
1191 QueryFilterItem::Column(RdbcColumnFilterItem::gt_column(column, value))
1192 }
1193 pub(crate) fn le_(column: RdbcColumn, value: RdbcValue) -> QueryFilterItem {
1194 QueryFilterItem::Value(RdbcValueFilterItem::le_(column, value))
1195 }
1196 pub fn le_column(column: RdbcColumn, value: RdbcColumn) -> QueryFilterItem {
1197 QueryFilterItem::Column(RdbcColumnFilterItem::le_column(column, value))
1198 }
1199 pub(crate) fn lt_(column: RdbcColumn, value: RdbcValue) -> QueryFilterItem {
1200 QueryFilterItem::Value(RdbcValueFilterItem::lt_(column, value))
1201 }
1202 pub fn lt_column(column: RdbcColumn, value: RdbcColumn) -> QueryFilterItem {
1203 QueryFilterItem::Column(RdbcColumnFilterItem::lt_column(column, value))
1204 }
1205
1206 pub fn null_(column: RdbcColumn) -> QueryFilterItem {
1207 QueryFilterItem::Column(RdbcColumnFilterItem::null_(column))
1208 }
1209 pub fn not_null_(column: RdbcColumn) -> QueryFilterItem {
1210 QueryFilterItem::Column(RdbcColumnFilterItem::not_null_(column))
1211 }
1212 pub fn like_(column: RdbcColumn, value: RdbcValue) -> QueryFilterItem {
1213 QueryFilterItem::Value(RdbcValueFilterItem::like_(column, value))
1214 }
1215 pub fn like_left_(column: RdbcColumn, value: RdbcValue) -> QueryFilterItem {
1216 QueryFilterItem::Value(RdbcValueFilterItem::like_left_(column, value))
1217 }
1218 pub fn like_right_(column: RdbcColumn, value: RdbcValue) -> QueryFilterItem {
1219 QueryFilterItem::Value(RdbcValueFilterItem::like_right_(column, value))
1220 }
1221
1222 pub fn not_like_(column: RdbcColumn, value: RdbcValue) -> QueryFilterItem {
1223 QueryFilterItem::Value(RdbcValueFilterItem::not_like_(column, value))
1224 }
1225 pub fn not_like_left_(column: RdbcColumn, value: RdbcValue) -> QueryFilterItem {
1226 QueryFilterItem::Value(RdbcValueFilterItem::not_like_left_(column, value))
1227 }
1228 pub fn not_like_right_(column: RdbcColumn, value: RdbcValue) -> QueryFilterItem {
1229 QueryFilterItem::Value(RdbcValueFilterItem::not_like_right_(column, value))
1230 }
1231 pub(crate) fn between_(
1232 column: RdbcColumn,
1233 value_start: RdbcValue,
1234 value_end: RdbcValue,
1235 ) -> QueryFilterItem {
1236 QueryFilterItem::Value(RdbcValueFilterItem::between_(
1237 column,
1238 value_start,
1239 value_end,
1240 ))
1241 }
1242 pub(crate) fn not_between_(
1243 column: RdbcColumn,
1244 value_start: RdbcValue,
1245 value_end: RdbcValue,
1246 ) -> QueryFilterItem {
1247 QueryFilterItem::Value(RdbcValueFilterItem::not_between_(
1248 column,
1249 value_start,
1250 value_end,
1251 ))
1252 }
1253 pub fn in_v(column: RdbcColumn, value_vec: Vec<RdbcValue>) -> QueryFilterItem {
1254 QueryFilterItem::Value(RdbcValueFilterItem::in_v(column, value_vec))
1255 }
1256 pub fn in_query(column: RdbcColumn, query_wrapper: QueryWrapper) -> QueryFilterItem {
1257 QueryFilterItem::Query(RdbcQueryFilterItem::in_query(column, query_wrapper))
1258 }
1259 pub fn not_in_v(column: RdbcColumn, value_vec: Vec<RdbcValue>) -> QueryFilterItem {
1260 QueryFilterItem::Value(RdbcValueFilterItem::not_in_v(column, value_vec))
1261 }
1262 pub fn not_in_query(column: RdbcColumn, value: QueryWrapper) -> QueryFilterItem {
1263 QueryFilterItem::Query(RdbcQueryFilterItem::not_in_query(column, value))
1264 }
1265 pub fn exists_(column: RdbcColumn, value: QueryWrapper) -> QueryFilterItem {
1266 QueryFilterItem::Query(RdbcQueryFilterItem::exists_query(column, value))
1267 }
1268 pub fn not_exists_(column: RdbcColumn, value: QueryWrapper) -> QueryFilterItem {
1269 QueryFilterItem::Query(RdbcQueryFilterItem::not_exists_query(column, value))
1270 }
1271}
1272
1273pub struct RdbcValueFilterItem {
1274 column_: RdbcColumn,
1275 compare_: RdbcCompareType,
1276 value: Option<RdbcValue>,
1277 ignore_null: bool,
1278}
1279impl RdbcValueFilterItem {
1280 pub fn get_column(&self) -> &RdbcColumn {
1281 &self.column_
1282 }
1283 pub fn get_compare(&self) -> &RdbcCompareType {
1284 &self.compare_
1285 }
1286 pub fn get_value(&self) -> Option<&RdbcValue> {
1287 self.value.as_ref()
1288 }
1289 pub fn get_ignore_null(&self) -> bool {
1290 self.ignore_null
1291 }
1292}
1293impl RdbcValueFilterItem {
1294 pub fn eq_(column: RdbcColumn, value: RdbcValue) -> RdbcValueFilterItem {
1295 RdbcValueFilterItem {
1296 column_: column,
1297 compare_: RdbcCompareType::Eq,
1298 value: Some(value),
1299 ignore_null: false,
1300 }
1301 }
1302 pub fn ne_(column: RdbcColumn, value: RdbcValue) -> RdbcValueFilterItem {
1303 RdbcValueFilterItem {
1304 column_: column,
1305 compare_: RdbcCompareType::NotEq,
1306 value: Some(value),
1307 ignore_null: false,
1308 }
1309 }
1310 pub fn ge_(column: RdbcColumn, value: RdbcValue) -> RdbcValueFilterItem {
1311 RdbcValueFilterItem {
1312 column_: column,
1313 compare_: RdbcCompareType::GtEq,
1314 value: Some(value),
1315 ignore_null: false,
1316 }
1317 }
1318
1319 pub fn gt_(column: RdbcColumn, value: RdbcValue) -> RdbcValueFilterItem {
1320 RdbcValueFilterItem {
1321 column_: column,
1322 compare_: RdbcCompareType::Gt,
1323 value: Some(value),
1324 ignore_null: false,
1325 }
1326 }
1327
1328 pub fn le_(column: RdbcColumn, value: RdbcValue) -> RdbcValueFilterItem {
1329 RdbcValueFilterItem {
1330 column_: column,
1331 compare_: RdbcCompareType::LtEq,
1332 value: Some(value),
1333 ignore_null: false,
1334 }
1335 }
1336
1337 pub fn lt_(column: RdbcColumn, value: RdbcValue) -> RdbcValueFilterItem {
1338 RdbcValueFilterItem {
1339 column_: column,
1340 compare_: RdbcCompareType::Lt,
1341 value: Some(value),
1342 ignore_null: false,
1343 }
1344 }
1345 pub fn like_(column: RdbcColumn, value: RdbcValue) -> RdbcValueFilterItem {
1346 RdbcValueFilterItem {
1347 column_: column,
1348 compare_: RdbcCompareType::Like,
1349 value: Some(value),
1350 ignore_null: false,
1351 }
1352 }
1353 pub fn like_left_(column: RdbcColumn, value: RdbcValue) -> RdbcValueFilterItem {
1354 RdbcValueFilterItem {
1355 column_: column,
1356 compare_: RdbcCompareType::LikeLeft,
1357 value: Some(value),
1358 ignore_null: false,
1359 }
1360 }
1361 pub fn like_right_(column: RdbcColumn, value: RdbcValue) -> RdbcValueFilterItem {
1362 RdbcValueFilterItem {
1363 column_: column,
1364 compare_: RdbcCompareType::LikeRight,
1365 value: Some(value),
1366 ignore_null: false,
1367 }
1368 }
1369 pub fn not_like_(column: RdbcColumn, value: RdbcValue) -> RdbcValueFilterItem {
1370 RdbcValueFilterItem {
1371 column_: column,
1372 compare_: RdbcCompareType::NotLike,
1373 value: Some(value),
1374 ignore_null: false,
1375 }
1376 }
1377 pub fn not_like_left_(column: RdbcColumn, value: RdbcValue) -> RdbcValueFilterItem {
1378 RdbcValueFilterItem {
1379 column_: column,
1380 compare_: RdbcCompareType::NotLikeLeft,
1381 value: Some(value),
1382 ignore_null: false,
1383 }
1384 }
1385 pub fn not_like_right_(column: RdbcColumn, value: RdbcValue) -> RdbcValueFilterItem {
1386 RdbcValueFilterItem {
1387 column_: column,
1388 compare_: RdbcCompareType::NotLikeRight,
1389 value: Some(value),
1390 ignore_null: false,
1391 }
1392 }
1393 pub fn between_(
1394 column: RdbcColumn,
1395 value_start: RdbcValue,
1396 value_end: RdbcValue,
1397 ) -> RdbcValueFilterItem {
1398 let value = RdbcValue::Vec(vec![value_start, value_end]);
1399 RdbcValueFilterItem {
1400 column_: column,
1401 compare_: RdbcCompareType::Between,
1402 value: Some(value),
1403 ignore_null: false,
1404 }
1405 }
1406 pub fn not_between_(
1407 column: RdbcColumn,
1408 value_start: RdbcValue,
1409 value_end: RdbcValue,
1410 ) -> RdbcValueFilterItem {
1411 let value = RdbcValue::Vec(vec![value_start, value_end]);
1412 RdbcValueFilterItem {
1413 column_: column,
1414 compare_: RdbcCompareType::NotBetween,
1415 value: Some(value),
1416 ignore_null: false,
1417 }
1418 }
1419 pub fn in_v(column: RdbcColumn, value_vec: Vec<RdbcValue>) -> RdbcValueFilterItem {
1420 RdbcValueFilterItem {
1421 column_: RdbcColumn::from(column),
1422 compare_: RdbcCompareType::In,
1423 value: Some(RdbcValue::Vec(value_vec)),
1424 ignore_null: true,
1425 }
1426 }
1427 pub fn not_in_v(column: RdbcColumn, value_vec: Vec<RdbcValue>) -> RdbcValueFilterItem {
1428 RdbcValueFilterItem {
1429 column_: RdbcColumn::from(column),
1430 compare_: RdbcCompareType::NotIn,
1431 value: Some(RdbcValue::Vec(value_vec)),
1432 ignore_null: true,
1433 }
1434 }
1435}
1436
1437pub struct RdbcColumnFilterItem {
1438 column_: RdbcColumn,
1439 compare_: RdbcCompareType,
1440 value: Option<RdbcColumn>,
1441}
1442impl RdbcColumnFilterItem {
1443 pub fn get_column(&self) -> &RdbcColumn {
1444 &self.column_
1445 }
1446 pub fn get_compare(&self) -> &RdbcCompareType {
1447 &self.compare_
1448 }
1449 pub fn get_value(&self) -> Option<&RdbcColumn> {
1450 self.value.as_ref()
1451 }
1452}
1453impl RdbcColumnFilterItem {
1454 pub fn eq_column(column: RdbcColumn, value: RdbcColumn) -> RdbcColumnFilterItem {
1455 RdbcColumnFilterItem {
1456 column_: column,
1457 compare_: RdbcCompareType::Eq,
1458 value: Some(value),
1459 }
1460 }
1461 pub fn ne_column(column: RdbcColumn, value: RdbcColumn) -> RdbcColumnFilterItem {
1462 RdbcColumnFilterItem {
1463 column_: column,
1464 compare_: RdbcCompareType::NotEq,
1465 value: Some(value),
1466 }
1467 }
1468 pub fn ge_column(column: RdbcColumn, value: RdbcColumn) -> RdbcColumnFilterItem {
1469 RdbcColumnFilterItem {
1470 column_: column,
1471 compare_: RdbcCompareType::GtEq,
1472 value: Some(value),
1473 }
1474 }
1475 pub fn gt_column(column: RdbcColumn, value: RdbcColumn) -> RdbcColumnFilterItem {
1476 RdbcColumnFilterItem {
1477 column_: column,
1478 compare_: RdbcCompareType::Gt,
1479 value: Some(value),
1480 }
1481 }
1482 pub fn le_column(column: RdbcColumn, value: RdbcColumn) -> RdbcColumnFilterItem {
1483 RdbcColumnFilterItem {
1484 column_: column,
1485 compare_: RdbcCompareType::LtEq,
1486 value: Some(value),
1487 }
1488 }
1489 pub fn lt_column(column: RdbcColumn, value: RdbcColumn) -> RdbcColumnFilterItem {
1490 RdbcColumnFilterItem {
1491 column_: column,
1492 compare_: RdbcCompareType::Lt,
1493 value: Some(value),
1494 }
1495 }
1496 pub fn null_(column: RdbcColumn) -> RdbcColumnFilterItem {
1497 RdbcColumnFilterItem {
1498 column_: column,
1499 compare_: RdbcCompareType::IsNull,
1500 value: None,
1501 }
1502 }
1503 pub fn not_null_(column: RdbcColumn) -> RdbcColumnFilterItem {
1504 RdbcColumnFilterItem {
1505 column_: column,
1506 compare_: RdbcCompareType::IsNotNull,
1507 value: None,
1508 }
1509 }
1510}
1511
1512pub struct RdbcQueryFilterItem {
1513 column_: RdbcColumn,
1514 compare_: RdbcCompareType,
1515 value: Option<QueryWrapper>,
1516}
1517impl RdbcQueryFilterItem {
1518 pub fn get_column(&self) -> &RdbcColumn {
1519 &self.column_
1520 }
1521 pub fn get_compare(&self) -> &RdbcCompareType {
1522 &self.compare_
1523 }
1524 pub fn get_value(&self) -> Option<&QueryWrapper> {
1525 self.value.as_ref()
1526 }
1527}
1528impl RdbcQueryFilterItem {
1529 fn in_query(rdbc_column: RdbcColumn, query_wrapper: QueryWrapper) -> RdbcQueryFilterItem {
1530 RdbcQueryFilterItem {
1531 column_: rdbc_column,
1532 compare_: RdbcCompareType::In,
1533 value: Some(query_wrapper),
1534 }
1535 }
1536 fn not_in_query(rdbc_column: RdbcColumn, query_wrapper: QueryWrapper) -> RdbcQueryFilterItem {
1537 RdbcQueryFilterItem {
1538 column_: rdbc_column,
1539 compare_: RdbcCompareType::NotIn,
1540 value: Some(query_wrapper),
1541 }
1542 }
1543 fn exists_query(rdbc_column: RdbcColumn, query_wrapper: QueryWrapper) -> RdbcQueryFilterItem {
1544 RdbcQueryFilterItem {
1545 column_: rdbc_column,
1546 compare_: RdbcCompareType::Exists,
1547 value: Some(query_wrapper),
1548 }
1549 }
1550 fn not_exists_query(
1551 rdbc_column: RdbcColumn,
1552 query_wrapper: QueryWrapper,
1553 ) -> RdbcQueryFilterItem {
1554 RdbcQueryFilterItem {
1555 column_: rdbc_column,
1556 compare_: RdbcCompareType::NotExists,
1557 value: Some(query_wrapper),
1558 }
1559 }
1560}
1561
1562pub enum RdbcCompareType {
1563 Eq,
1564 NotEq,
1565 Gt,
1566 GtEq,
1567 Lt,
1568 LtEq,
1569 Like,
1570 LikeLeft,
1571 LikeRight,
1572 NotLike,
1573 NotLikeLeft,
1574 NotLikeRight,
1575 In,
1576 NotIn,
1577 IsNull,
1578 IsNotNull,
1579 Exists,
1580 NotExists,
1581 Between,
1582 NotBetween,
1583}
1584impl RdbcCompareType {
1585 pub fn name(&self) -> String {
1586 match self {
1587 RdbcCompareType::Eq => "=".to_string(),
1588 RdbcCompareType::NotEq => "<>".to_string(),
1589 RdbcCompareType::Gt => ">".to_string(),
1590 RdbcCompareType::GtEq => ">=".to_string(),
1591 RdbcCompareType::Lt => "<".to_string(),
1592 RdbcCompareType::LtEq => "<=".to_string(),
1593 RdbcCompareType::Like => "LIKE".to_string(),
1594 RdbcCompareType::LikeLeft => "LIKE".to_string(),
1595 RdbcCompareType::LikeRight => "LIKE".to_string(),
1596 RdbcCompareType::NotLike => "NOT LIKE".to_string(),
1597 RdbcCompareType::NotLikeLeft => "NOT LIKE".to_string(),
1598 RdbcCompareType::NotLikeRight => "NOT LIKE".to_string(),
1599 RdbcCompareType::In => "IN".to_string(),
1600 RdbcCompareType::NotIn => "NOT IN".to_string(),
1601 RdbcCompareType::IsNull => "IS NULL".to_string(),
1602 RdbcCompareType::IsNotNull => "IS NOT NULL".to_string(),
1603 RdbcCompareType::Exists => "EXISTS".to_string(),
1604 RdbcCompareType::NotExists => "NOT EXISTS".to_string(),
1605 RdbcCompareType::Between => "BETWEEN".to_string(),
1606 RdbcCompareType::NotBetween => "NOT BETWEEN".to_string(),
1607 }
1608 }
1609}
1610pub enum RdbcOrder {
1611 Column(RdbcColumnOrder),
1612}
1613
1614impl RdbcOrder {
1615 pub fn asc_<RC>(column: RC) -> RdbcOrder
1616 where
1617 RdbcColumn: From<RC>,
1618 {
1619 RdbcOrder::Column(RdbcColumnOrder::asc_(column))
1620 }
1621
1622 pub fn desc_<RC>(column: RC) -> RdbcOrder
1623 where
1624 RdbcColumn: From<RC>,
1625 {
1626 RdbcOrder::Column(RdbcColumnOrder::asc_(column))
1627 }
1628}
1629
1630pub struct RdbcColumnOrder {
1631 column: RdbcColumn,
1632 order: RdbcOrderType,
1633}
1634
1635impl RdbcColumnOrder {
1636 pub fn asc_<RC>(column: RC) -> RdbcColumnOrder
1637 where
1638 RdbcColumn: From<RC>,
1639 {
1640 RdbcColumnOrder {
1641 column: RdbcColumn::from(column),
1642 order: RdbcOrderType::Asc,
1643 }
1644 }
1645 pub fn desc_<RC>(column: RC) -> RdbcColumnOrder
1646 where
1647 RdbcColumn: From<RC>,
1648 {
1649 RdbcColumnOrder {
1650 column: RdbcColumn::from(column),
1651 order: RdbcOrderType::Desc,
1652 }
1653 }
1654
1655 pub fn get_column(&self) -> &RdbcColumn {
1656 &self.column
1657 }
1658 pub fn get_order(&self) -> &RdbcOrderType {
1659 &self.order
1660 }
1661}
1662
1663pub enum RdbcOrderType {
1664 Asc,
1665 Desc,
1666}
1667
1668pub enum RdbcDmlValue {
1669 VALUE(RdbcValue),
1670 COLUMN(RdbcColumn),
1671}
1672
1673impl RdbcDmlValue {
1674 pub fn is_value(&self) -> bool {
1675 match self {
1676 RdbcDmlValue::VALUE(_) => true,
1677 RdbcDmlValue::COLUMN(_) => false,
1678 }
1679 }
1680 pub fn is_column(&self) -> bool {
1681 match self {
1682 RdbcDmlValue::VALUE(_) => false,
1683 RdbcDmlValue::COLUMN(_) => true,
1684 }
1685 }
1686 pub fn get_value(&self) -> Option<&RdbcValue> {
1687 match self {
1688 RdbcDmlValue::VALUE(value) => Some(value),
1689 RdbcDmlValue::COLUMN(_) => None,
1690 }
1691 }
1692 pub fn get_column(&self) -> Option<&RdbcColumn> {
1693 match self {
1694 RdbcDmlValue::VALUE(_) => None,
1695 RdbcDmlValue::COLUMN(column) => Some(column),
1696 }
1697 }
1698}
1699
1700impl From<RdbcColumn> for RdbcDmlValue {
1701 fn from(value: RdbcColumn) -> Self {
1702 RdbcDmlValue::COLUMN(value)
1703 }
1704}
1705
1706impl<T> From<T> for RdbcDmlValue
1707where
1708 RdbcValue: From<T>,
1709{
1710 fn from(value: T) -> Self {
1711 RdbcDmlValue::VALUE(RdbcValue::from(value))
1712 }
1713}
1714
1715pub fn table<T>(table: T) -> RdbcTableInner
1716where
1717 T: ToString,
1718{
1719 RdbcTableInner::table(table)
1720}
1721
1722pub fn left_table<T>(table: T) -> RdbcTableInner
1723where
1724 T: ToString,
1725{
1726 RdbcTableInner::join_table(table, RdbcTableJoinType::Left)
1727}
1728
1729pub fn inner_table<T>(table: T) -> RdbcTableInner
1730where
1731 T: ToString,
1732{
1733 RdbcTableInner::join_table(table, RdbcTableJoinType::Inner)
1734}
1735
1736pub fn right_table<T>(table: T) -> RdbcTableInner
1737where
1738 T: ToString,
1739{
1740 RdbcTableInner::join_table(table, RdbcTableJoinType::Right)
1741}
1742
1743pub fn full_table<T>(table: T) -> RdbcTableInner
1744where
1745 T: ToString,
1746{
1747 RdbcTableInner::join_table(table, RdbcTableJoinType::Full)
1748}
1749
1750pub fn table_column<T, V>(table: T, column: V) -> RdbcTableColumn
1751where
1752 T: ToString,
1753 V: ToString,
1754{
1755 RdbcTableColumn::table_column(table, column)
1756}
1757
1758pub fn simple_column<T, V>(table: T, column: V) -> RdbcColumn
1759where
1760 T: ToString,
1761 V: ToString,
1762{
1763 RdbcColumn::table_column(table, column)
1764}
1765
1766pub fn value_column<V>(column: V) -> RdbcColumn
1767where
1768 V: ToString,
1769{
1770 RdbcColumn::rdbc_value(RdbcValue::String(column.to_string()))
1771}