1 /*
2  * Copyright 2015-2018 HuntLabs.cn
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 module hunt.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr;
17 
18 
19 
20 import hunt.collection;
21 
22 import hunt.sql.ast.SQLExpr;
23 import hunt.sql.ast.SQLExprImpl;
24 import hunt.sql.ast.SQLObject;
25 import hunt.sql.dialect.mysql.visitor.MySqlASTVisitor;
26 import hunt.sql.visitor.SQLASTVisitor;
27 import hunt.sql.dialect.mysql.ast.expr.MySqlExpr;
28 import std.uni;
29 
30 public class MySqlMatchAgainstExpr : SQLExprImpl , MySqlExpr {
31 
32     private List!(SQLExpr)  columns;
33 
34     private SQLExpr        against;
35 
36     private SearchModifier searchModifier;
37 
38     this(){
39         columns = new ArrayList!(SQLExpr)();
40     }
41 
42     override public MySqlMatchAgainstExpr clone() {
43         MySqlMatchAgainstExpr x = new MySqlMatchAgainstExpr();
44         foreach (SQLExpr column ; columns) {
45             SQLExpr column2 = column.clone();
46             column2.setParent(x);
47             x.columns.add(column2);
48         }
49         if (against !is null) {
50             x.setAgainst(against.clone());
51         }
52         x.searchModifier = searchModifier;
53         return x;
54     }
55 
56     public List!(SQLExpr) getColumns() {
57         return columns;
58     }
59 
60     public void setColumns(List!(SQLExpr) columns) {
61         this.columns = columns;
62     }
63 
64     public SQLExpr getAgainst() {
65         return against;
66     }
67 
68     public void setAgainst(SQLExpr against) {
69         if (against !is null) {
70             against.setParent(this);
71         }
72         this.against = against;
73     }
74 
75     public SearchModifier getSearchModifier() {
76         return searchModifier;
77     }
78 
79     public void setSearchModifier(SearchModifier searchModifier) {
80         this.searchModifier = searchModifier;
81     }
82 
83     public static struct SearchModifier {
84         enum SearchModifier IN_BOOLEAN_MODE =  SearchModifier("IN BOOLEAN MODE"); // 
85         enum SearchModifier IN_NATURAL_LANGUAGE_MODE =  SearchModifier("IN NATURAL LANGUAGE MODE"); //
86         enum SearchModifier IN_NATURAL_LANGUAGE_MODE_WITH_QUERY_EXPANSION =  SearchModifier("IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION");
87         enum SearchModifier WITH_QUERY_EXPANSION =   SearchModifier("WITH QUERY EXPANSION");
88 
89         public  string name;
90         public  string name_lcase;
91 
92         
93 
94         this(string name){
95             this.name = name;
96             this.name_lcase = toLower(name);
97         }
98 
99         bool opEquals(const SearchModifier h) nothrow {
100         return name == h.name ;
101         } 
102 
103         bool opEquals(ref const SearchModifier h) nothrow {
104             return name == h.name ;
105         } 
106     }
107 
108     
109     override  protected void accept0(SQLASTVisitor visitor) {
110         MySqlASTVisitor mysqlVisitor = cast(MySqlASTVisitor) visitor;
111         if (mysqlVisitor.visit(this)) {
112             acceptChild!SQLExpr(visitor, this.columns);
113             acceptChild(visitor, this.against);
114         }
115         mysqlVisitor.endVisit(this);
116     }
117 
118     override
119     public List!SQLObject getChildren() {
120         List!(SQLObject) children = new ArrayList!(SQLObject)();
121         children.addAll(cast(List!SQLObject)(this.columns));
122         children.add(this.against);
123         return children;
124     }
125 
126     override
127     public size_t toHash() @trusted nothrow {
128          int prime = 31;
129         size_t result = 1;
130         result = prime * result + ((against is null) ? 0 : (cast(Object)against).toHash());
131         result = prime * result + ((columns is null) ? 0 : (cast(Object)columns).toHash());
132         result = prime * result + hashOf(searchModifier);
133         return result;
134     }
135 
136     override
137     public bool opEquals(Object obj) {
138         if (this == obj) {
139             return true;
140         }
141         if (obj is null) {
142             return false;
143         }
144         // if ( typeid(this) != typeid(obj)) {
145         //     return false;
146         // }
147         MySqlMatchAgainstExpr other = cast(MySqlMatchAgainstExpr) obj;
148         if(other is null)
149             return false;
150         if (against is null) {
151             if (other.against !is null) {
152                 return false;
153             }
154         } else if (!(cast(Object)(against)).opEquals(cast(Object)(other.against))) {
155             return false;
156         }
157         if (columns is null) {
158             if (other.columns !is null) {
159                 return false;
160             }
161         } else if (!(cast(Object)(columns)).opEquals(cast(Object)(other.columns))) {
162             return false;
163         }
164         if (searchModifier != other.searchModifier) {
165             return false;
166         }
167         return true;
168     }
169 
170 }