Skip to content

Commit f914cc3

Browse files
authored
feat: add bitwise and/or operators (#841)
Signed-off-by: xxchan <xxchan22f@gmail.com>
1 parent 6771326 commit f914cc3

File tree

3 files changed

+70
-0
lines changed

3 files changed

+70
-0
lines changed

src/backend/query_builder.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,8 @@ pub trait QueryBuilder:
589589
BinOper::As => "AS",
590590
BinOper::Escape => "ESCAPE",
591591
BinOper::Custom(raw) => raw,
592+
BinOper::BitAnd => "&",
593+
BinOper::BitOr => "|",
592594
#[allow(unreachable_patterns)]
593595
_ => unimplemented!(),
594596
}

src/expr.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1299,6 +1299,72 @@ pub trait ExprTrait: Sized {
12991299
/// );
13001300
/// ```
13011301
fn unary(self, o: UnOper) -> SimpleExpr;
1302+
1303+
/// Express a bitwise AND operation.
1304+
///
1305+
/// # Examples
1306+
///
1307+
/// ```
1308+
/// use sea_query::{tests_cfg::*, *};
1309+
///
1310+
/// let query = Query::select()
1311+
/// .columns([Char::Character, Char::SizeW, Char::SizeH])
1312+
/// .from(Char::Table)
1313+
/// .and_where(1.bit_and(1).eq(1))
1314+
/// .to_owned();
1315+
///
1316+
/// assert_eq!(
1317+
/// query.to_string(MysqlQueryBuilder),
1318+
/// r#"SELECT `character`, `size_w`, `size_h` FROM `character` WHERE (1 & 1) = 1"#
1319+
/// );
1320+
/// assert_eq!(
1321+
/// query.to_string(PostgresQueryBuilder),
1322+
/// r#"SELECT "character", "size_w", "size_h" FROM "character" WHERE (1 & 1) = 1"#
1323+
/// );
1324+
/// assert_eq!(
1325+
/// query.to_string(SqliteQueryBuilder),
1326+
/// r#"SELECT "character", "size_w", "size_h" FROM "character" WHERE (1 & 1) = 1"#
1327+
/// );
1328+
/// ```
1329+
fn bit_and<R>(self, right: R) -> SimpleExpr
1330+
where
1331+
R: Into<SimpleExpr>,
1332+
{
1333+
ExprTrait::binary(self, BinOper::BitAnd, right)
1334+
}
1335+
1336+
/// Express a bitwise OR operation.
1337+
///
1338+
/// # Examples
1339+
///
1340+
/// ```
1341+
/// use sea_query::{tests_cfg::*, *};
1342+
///
1343+
/// let query = Query::select()
1344+
/// .columns([Char::Character, Char::SizeW, Char::SizeH])
1345+
/// .from(Char::Table)
1346+
/// .and_where(1.bit_or(1).eq(1))
1347+
/// .to_owned();
1348+
///
1349+
/// assert_eq!(
1350+
/// query.to_string(MysqlQueryBuilder),
1351+
/// r#"SELECT `character`, `size_w`, `size_h` FROM `character` WHERE (1 | 1) = 1"#
1352+
/// );
1353+
/// assert_eq!(
1354+
/// query.to_string(PostgresQueryBuilder),
1355+
/// r#"SELECT "character", "size_w", "size_h" FROM "character" WHERE (1 | 1) = 1"#
1356+
/// );
1357+
/// assert_eq!(
1358+
/// query.to_string(SqliteQueryBuilder),
1359+
/// r#"SELECT "character", "size_w", "size_h" FROM "character" WHERE (1 | 1) = 1"#
1360+
/// );
1361+
/// ```
1362+
fn bit_or<R>(self, right: R) -> SimpleExpr
1363+
where
1364+
R: Into<SimpleExpr>,
1365+
{
1366+
ExprTrait::binary(self, BinOper::BitOr, right)
1367+
}
13021368
}
13031369

13041370
/// This generic implementation covers all expression types,

src/types.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ pub enum BinOper {
181181
Mul,
182182
Div,
183183
Mod,
184+
BitAnd,
185+
BitOr,
184186
LShift,
185187
RShift,
186188
As,

0 commit comments

Comments
 (0)