1use super::Function;
2use crate::ast::{Column, Expression};
3
4pub type GroupByDefinition<'a> = Expression<'a>;
6
7#[derive(Debug, Default, PartialEq, Clone)]
9pub struct Grouping<'a>(pub Vec<GroupByDefinition<'a>>);
10
11impl<'a> Grouping<'a> {
12 #[doc(hidden)]
13 pub fn append(mut self, value: GroupByDefinition<'a>) -> Self {
14 self.0.push(value);
15 self
16 }
17
18 pub fn new(values: Vec<GroupByDefinition<'a>>) -> Self {
19 Self(values)
20 }
21
22 pub fn is_empty(&self) -> bool {
23 self.0.is_empty()
24 }
25}
26
27pub trait Groupable<'a>
29where
30 Self: Sized,
31{
32 fn group(self) -> GroupByDefinition<'a>;
34}
35
36pub trait IntoGroupByDefinition<'a> {
38 fn into_group_by_definition(self) -> GroupByDefinition<'a>;
39}
40
41impl<'a> IntoGroupByDefinition<'a> for &'a str {
42 fn into_group_by_definition(self) -> GroupByDefinition<'a> {
43 let column: Column = self.into();
44 column.into()
45 }
46}
47
48impl<'a> IntoGroupByDefinition<'a> for (&'a str, &'a str) {
49 fn into_group_by_definition(self) -> GroupByDefinition<'a> {
50 let column: Column = self.into();
51 column.into()
52 }
53}
54
55impl<'a> IntoGroupByDefinition<'a> for Column<'a> {
56 fn into_group_by_definition(self) -> GroupByDefinition<'a> {
57 self.into()
58 }
59}
60
61impl<'a> IntoGroupByDefinition<'a> for Function<'a> {
62 fn into_group_by_definition(self) -> GroupByDefinition<'a> {
63 self.into()
64 }
65}
66
67impl<'a> IntoGroupByDefinition<'a> for GroupByDefinition<'a> {
68 fn into_group_by_definition(self) -> GroupByDefinition<'a> {
69 self
70 }
71}
72
73impl<'a> Groupable<'a> for Column<'a> {
74 fn group(self) -> GroupByDefinition<'a> {
75 self.into()
76 }
77}
78
79impl<'a> Groupable<'a> for &'a str {
80 fn group(self) -> GroupByDefinition<'a> {
81 Column::from(self).group()
82 }
83}