tank_core/expression/
operand.rs1use crate::{
2 writer::{Context, SqlWriter},
3 DynQuery, Expression, ExpressionVisitor, OpPrecedence, Value,
4};
5use std::fmt;
6
7pub enum Operand<'a> {
8 Null,
9 LitBool(bool),
10 LitInt(i128),
11 LitFloat(f64),
12 LitStr(&'a str),
13 LitIdent(&'a str),
14 LitField(&'a [&'a str]),
15 LitList(&'a [Operand<'a>]),
16 LitTuple(&'a [Operand<'a>]),
17 Type(Value),
18 Variable(Value),
19 Value(&'a Value),
20 Call(&'static str, &'a [&'a dyn Expression]),
21 Asterisk,
22 QuestionMark,
23 CurrentTimestampMs,
24}
25
26impl fmt::Debug for Operand<'_> {
27 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
28 match self {
29 Self::Null => f.write_str("Null"),
30 Self::LitBool(v) => f.debug_tuple("LitBool").field(v).finish(),
31 Self::LitInt(v) => f.debug_tuple("LitInt").field(v).finish(),
32 Self::LitFloat(v) => f.debug_tuple("LitFloat").field(v).finish(),
33 Self::LitStr(v) => f.debug_tuple("LitStr").field(v).finish(),
34 Self::LitIdent(v) => f.debug_tuple("LitIdent").field(v).finish(),
35 Self::LitField(v) => f.debug_tuple("LitField").field(v).finish(),
36 Self::LitList(v) => f.debug_tuple("LitList").field(v).finish(),
37 Self::LitTuple(v) => f.debug_tuple("LitTuple").field(v).finish(),
38 Self::Type(v) => f.debug_tuple("Type").field(v).finish(),
39 Self::Variable(v) => f.debug_tuple("Variable").field(v).finish(),
40 Self::Value(v) => f.debug_tuple("Value").field(v).finish(),
41 Self::Call(name, _) => f.debug_tuple("Call").field(name).field(&"..").finish(),
42 Self::Asterisk => f.write_str("Asterisk"),
43 Self::QuestionMark => f.write_str("QuestionMark"),
44 Self::CurrentTimestampMs => f.write_str("CurrentTimestampMs"),
45 }
46 }
47}
48
49impl OpPrecedence for Operand<'_> {
50 fn precedence(&self, _writer: &dyn SqlWriter) -> i32 {
51 1_000_000
52 }
53}
54
55impl Expression for Operand<'_> {
56 fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, out: &mut DynQuery) {
57 writer.write_operand(context, out, self)
58 }
59
60 fn accept_visitor(
61 &self,
62 matcher: &mut dyn ExpressionVisitor,
63 writer: &dyn SqlWriter,
64 context: &mut Context,
65 out: &mut DynQuery,
66 ) -> bool {
67 matcher.visit_operand(writer, context, out, self)
68 }
69}
70
71impl PartialEq for Operand<'_> {
72 fn eq(&self, other: &Self) -> bool {
73 match (self, other) {
74 (Self::LitBool(l), Self::LitBool(r)) => l == r,
75 (Self::LitFloat(l), Self::LitFloat(r)) => l == r,
76 (Self::LitIdent(l), Self::LitIdent(r)) => l == r,
77 (Self::LitField(l), Self::LitField(r)) => l == r,
78 (Self::LitInt(l), Self::LitInt(r)) => l == r,
79 (Self::LitStr(l), Self::LitStr(r)) => l == r,
80 (Self::LitList(l), Self::LitList(r)) => l == r,
81 (Self::LitTuple(l), Self::LitTuple(r)) => l == r,
82 (Self::Type(l), Self::Type(r)) => l.same_type(r),
83 (Self::Variable(l), Self::Variable(r)) => l == r,
84 (Self::Asterisk, Self::Asterisk) => true,
85 (Self::QuestionMark, Self::QuestionMark) => true,
86 (Self::CurrentTimestampMs, Self::CurrentTimestampMs) => true,
87 _ => false,
88 }
89 }
90}