sea_query/extension/sqlite/expr.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
use crate::{ColumnRef, Expr, ExprTrait, FunctionCall, Keyword, LikeExpr, SimpleExpr, Value};
use super::SqliteBinOper;
pub trait SqliteExpr: ExprTrait {
/// Express an sqlite `GLOB` operator.
///
/// # Examples
///
/// ```
/// use sea_query::{extension::sqlite::SqliteExpr, tests_cfg::*, *};
///
/// let query = Query::select()
/// .column(Font::Name)
/// .from(Font::Table)
/// .and_where(Expr::col(Font::Name).glob("a"))
/// .to_owned();
///
/// assert_eq!(
/// query.to_string(SqliteQueryBuilder),
/// r#"SELECT "name" FROM "font" WHERE "name" GLOB 'a'"#
/// );
/// ```
fn glob<T>(self, right: T) -> SimpleExpr
where
T: Into<SimpleExpr>,
{
self.binary(SqliteBinOper::Glob, right)
}
/// Express an sqlite `MATCH` operator.
///
/// # Examples
///
/// ```
/// use sea_query::{extension::sqlite::SqliteExpr, tests_cfg::*, *};
///
/// let query = Query::select()
/// .column(Font::Name)
/// .from(Font::Table)
/// .and_where(Expr::col(Font::Name).matches("a"))
/// .to_owned();
///
/// assert_eq!(
/// query.to_string(SqliteQueryBuilder),
/// r#"SELECT "name" FROM "font" WHERE "name" MATCH 'a'"#
/// );
/// ```
fn matches<T>(self, right: T) -> SimpleExpr
where
T: Into<SimpleExpr>,
{
self.binary(SqliteBinOper::Match, right)
}
/// Express an sqlite retrieves JSON field as JSON value (`->`).
///
/// # Examples
///
/// ```
/// use sea_query::{extension::sqlite::SqliteExpr, tests_cfg::*, *};
///
/// let query = Query::select()
/// .column(Font::Variant)
/// .from(Font::Table)
/// .and_where(Expr::col(Font::Variant).get_json_field("a"))
/// .to_owned();
///
/// assert_eq!(
/// query.to_string(SqliteQueryBuilder),
/// r#"SELECT "variant" FROM "font" WHERE "variant" -> 'a'"#
/// );
/// ```
fn get_json_field<T>(self, right: T) -> SimpleExpr
where
T: Into<SimpleExpr>,
{
self.binary(SqliteBinOper::GetJsonField, right)
}
/// Express an sqlite retrieves JSON field and casts it to an appropriate SQL type (`->>`).
///
/// # Examples
///
/// ```
/// use sea_query::{extension::sqlite::SqliteExpr, tests_cfg::*, *};
///
/// let query = Query::select()
/// .column(Font::Variant)
/// .from(Font::Table)
/// .and_where(Expr::col(Font::Variant).cast_json_field("a"))
/// .to_owned();
///
/// assert_eq!(
/// query.to_string(SqliteQueryBuilder),
/// r#"SELECT "variant" FROM "font" WHERE "variant" ->> 'a'"#
/// );
/// ```
fn cast_json_field<T>(self, right: T) -> SimpleExpr
where
T: Into<SimpleExpr>,
{
self.binary(SqliteBinOper::CastJsonField, right)
}
}
// TODO: https://github.com/SeaQL/sea-query/discussions/795:
// replace all of this with `impl<T> PgExpr for T where T: ExprTrait {}`
impl SqliteExpr for Expr {}
impl SqliteExpr for SimpleExpr {}
impl SqliteExpr for FunctionCall {}
impl SqliteExpr for ColumnRef {}
impl SqliteExpr for Keyword {}
impl SqliteExpr for LikeExpr {}
impl SqliteExpr for Value {}