sqlint/ast/
grouping.rs

1use super::Function;
2use crate::ast::{Column, Expression};
3
4/// Defines a grouping for the `GROUP BY` statement.
5pub type GroupByDefinition<'a> = Expression<'a>;
6
7/// A list of definitions for the `GROUP BY` statement
8#[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
27/// An item that can be used in the `GROUP BY` statement
28pub trait Groupable<'a>
29where
30    Self: Sized,
31{
32    /// Group by `self`
33    fn group(self) -> GroupByDefinition<'a>;
34}
35
36/// Convert the value into a group by definition.
37pub 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}