diesel/pg/expression/
array.rs

1use backend::Backend;
2use expression::{
3    AppearsOnTable, AsExpressionList, Expression, NonAggregate, SelectableExpression,
4};
5use query_builder::{AstPass, QueryFragment};
6use sql_types;
7use std::marker::PhantomData;
8
9/// An ARRAY[...] literal.
10#[derive(Debug, Clone, Copy, QueryId)]
11pub struct ArrayLiteral<T, ST> {
12    elements: T,
13    _marker: PhantomData<ST>,
14}
15
16/// Creates an `ARRAY[...]` expression.
17///
18/// The argument should be a tuple of expressions which can be represented by the
19/// same SQL type.
20///
21/// # Examples
22///
23/// ```rust
24/// # #[macro_use] extern crate diesel;
25/// # include!("../../doctest_setup.rs");
26/// #
27/// # fn main() {
28/// #     run_test().unwrap();
29/// # }
30/// #
31/// # fn run_test() -> QueryResult<()> {
32/// #     use schema::users::dsl::*;
33/// #     use diesel::dsl::array;
34/// #     use diesel::sql_types::Integer;
35/// #     let connection = establish_connection();
36/// let ints = diesel::select(array::<Integer, _>((1, 2)))
37///     .get_result::<Vec<i32>>(&connection)?;
38/// assert_eq!(vec![1, 2], ints);
39///
40/// let ids = users.select(array((id, id * 2)))
41///     .get_results::<Vec<i32>>(&connection)?;
42/// let expected = vec![
43///     vec![1, 2],
44///     vec![2, 4],
45/// ];
46/// assert_eq!(expected, ids);
47/// #     Ok(())
48/// # }
49/// ```
50pub fn array<ST, T>(elements: T) -> ArrayLiteral<T::Expression, ST>
51where
52    T: AsExpressionList<ST>,
53{
54    ArrayLiteral {
55        elements: elements.as_expression_list(),
56        _marker: PhantomData,
57    }
58}
59
60impl<T, ST> Expression for ArrayLiteral<T, ST>
61where
62    T: Expression,
63{
64    type SqlType = sql_types::Array<ST>;
65}
66
67impl<T, ST, DB> QueryFragment<DB> for ArrayLiteral<T, ST>
68where
69    DB: Backend,
70    for<'a> (&'a T): QueryFragment<DB>,
71{
72    fn walk_ast(&self, mut out: AstPass<DB>) -> ::result::QueryResult<()> {
73        out.push_sql("ARRAY[");
74        QueryFragment::walk_ast(&&self.elements, out.reborrow())?;
75        out.push_sql("]");
76        Ok(())
77    }
78}
79
80impl<T, ST, QS> SelectableExpression<QS> for ArrayLiteral<T, ST>
81where
82    T: SelectableExpression<QS>,
83    ArrayLiteral<T, ST>: AppearsOnTable<QS>,
84{
85}
86
87impl<T, ST, QS> AppearsOnTable<QS> for ArrayLiteral<T, ST>
88where
89    T: AppearsOnTable<QS>,
90    ArrayLiteral<T, ST>: Expression,
91{
92}
93
94impl<T, ST> NonAggregate for ArrayLiteral<T, ST>
95where
96    T: NonAggregate,
97    ArrayLiteral<T, ST>: Expression,
98{
99}