1 module hunt.sql.ast.expr.SQLSomeExpr;
2 import hunt.sql.ast.statement.SQLSelectItem;
3 import hunt.sql.ast.statement.SQLSelect;
4 import hunt.sql.ast.statement.SQLSelectQueryBlock;
5 import hunt.sql.ast.SQLExprImpl;
6 import hunt.collection;
7 import hunt.sql.visitor.SQLASTVisitor;
8 import hunt.sql.ast.SQLDataType;
9 import hunt.sql.ast.SQLObject;
10 import hunt.util.StringBuilder;
11
12 public class SQLSomeExpr : SQLExprImpl {
13
14 public SQLSelect subQuery;
15
16 public this(){
17
18 }
19
20 public this(SQLSelect select){
21 this.setSubQuery(select);
22 }
23
24 override public SQLSomeExpr clone() {
25 SQLSomeExpr x = new SQLSomeExpr();
26 if (subQuery !is null) {
27 x.setSubQuery(subQuery.clone());
28 }
29 return x;
30 }
31
32 public SQLSelect getSubQuery() {
33 return this.subQuery;
34 }
35
36 public void setSubQuery(SQLSelect subQuery) {
37 if (subQuery !is null) {
38 subQuery.setParent(this);
39 }
40 this.subQuery = subQuery;
41 }
42
43 override public void output(StringBuilder buf) {
44 this.subQuery.output(buf);
45 }
46
47 protected override void accept0(SQLASTVisitor visitor) {
48 if (visitor.visit(this)) {
49 acceptChild(visitor, this.subQuery);
50 }
51
52 visitor.endVisit(this);
53 }
54
55 public override size_t toHash() @trusted nothrow {
56 int prime = 31;
57 size_t result = 1;
58 result = prime * result + ((subQuery is null) ? 0 : (cast(Object)subQuery).toHash());
59 return result;
60 }
61
62 public override bool opEquals(Object obj) {
63 if (this is obj) {
64 return true;
65 }
66 if (obj is null) {
67 return false;
68 }
69 if (typeid(SQLSomeExpr) != typeid(obj)) {
70 return false;
71 }
72 SQLSomeExpr other = cast(SQLSomeExpr) obj;
73 if (subQuery is null) {
74 if (other.subQuery !is null) {
75 return false;
76 }
77 } else if (!(cast(Object)(subQuery)).opEquals(cast(Object)(other.subQuery))) {
78 return false;
79 }
80 return true;
81 }
82
83 override public SQLDataType computeDataType() {
84 if (subQuery is null) {
85 return null;
86 }
87
88 SQLSelectQueryBlock queryBlock = subQuery.getFirstQueryBlock();
89 if (queryBlock is null) {
90 return null;
91 }
92
93 List!SQLSelectItem selectList = queryBlock.getSelectList();
94 if (selectList.size() == 1) {
95 return selectList.get(0).computeDataType();
96 }
97
98 return null;
99 }
100
101 public override List!SQLObject getChildren() {
102 return Collections.singletonList!SQLObject(this.subQuery);
103 }
104 }