View Javadoc
1   /**
2    *    Copyright 2006-2016 the original author or authors.
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  package org.mybatis.generator.codegen.ibatis2.sqlmap.elements;
17  
18  import static org.mybatis.generator.internal.util.StringUtility.stringHasValue;
19  
20  import org.mybatis.generator.api.IntrospectedColumn;
21  import org.mybatis.generator.api.dom.xml.Attribute;
22  import org.mybatis.generator.api.dom.xml.TextElement;
23  import org.mybatis.generator.api.dom.xml.XmlElement;
24  
25  /**
26   * 
27   * @author Jeff Butler
28   * 
29   */
30  public class ExampleWhereClauseElementGenerator extends
31          AbstractXmlElementGenerator {
32  
33      public ExampleWhereClauseElementGenerator() {
34          super();
35      }
36  
37      @Override
38      public void addElements(XmlElement parentElement) {
39          XmlElement answer = new XmlElement("sql"); //$NON-NLS-1$
40  
41          answer.addAttribute(new Attribute(
42                  "id", introspectedTable.getExampleWhereClauseId())); //$NON-NLS-1$
43  
44          context.getCommentGenerator().addComment(answer);
45  
46          XmlElement outerIterateElement = new XmlElement("iterate"); //$NON-NLS-1$
47          outerIterateElement.addAttribute(new Attribute(
48                  "property", "oredCriteria")); //$NON-NLS-1$ //$NON-NLS-2$
49          outerIterateElement.addAttribute(new Attribute("conjunction", "or")); //$NON-NLS-1$ //$NON-NLS-2$
50          outerIterateElement.addAttribute(new Attribute("prepend", "where")); //$NON-NLS-1$ //$NON-NLS-2$
51          outerIterateElement.addAttribute(new Attribute(
52                  "removeFirstPrepend", "iterate")); //$NON-NLS-1$ //$NON-NLS-2$
53          answer.addElement(outerIterateElement);
54  
55          XmlElement isEqualElement = new XmlElement("isEqual"); //$NON-NLS-1$
56          isEqualElement.addAttribute(new Attribute(
57                  "property", "oredCriteria[].valid")); //$NON-NLS-1$ //$NON-NLS-2$
58          isEqualElement.addAttribute(new Attribute("compareValue", "true")); //$NON-NLS-1$ //$NON-NLS-2$
59          outerIterateElement.addElement(isEqualElement);
60  
61          isEqualElement.addElement(new TextElement("(")); //$NON-NLS-1$
62  
63          XmlElement innerIterateElement = new XmlElement("iterate"); //$NON-NLS-1$
64          innerIterateElement.addAttribute(new Attribute("prepend", "and")); //$NON-NLS-1$ //$NON-NLS-2$
65          innerIterateElement.addAttribute(new Attribute(
66                  "property", "oredCriteria[].criteriaWithoutValue")); //$NON-NLS-1$ //$NON-NLS-2$
67          innerIterateElement.addAttribute(new Attribute("conjunction", "and")); //$NON-NLS-1$ //$NON-NLS-2$
68          innerIterateElement.addElement(new TextElement(
69                  "$oredCriteria[].criteriaWithoutValue[]$")); //$NON-NLS-1$
70          isEqualElement.addElement(innerIterateElement);
71  
72          innerIterateElement = new XmlElement("iterate"); //$NON-NLS-1$
73          innerIterateElement.addAttribute(new Attribute("prepend", "and")); //$NON-NLS-1$ //$NON-NLS-2$
74          innerIterateElement.addAttribute(new Attribute(
75                  "property", "oredCriteria[].criteriaWithSingleValue")); //$NON-NLS-1$ //$NON-NLS-2$
76          innerIterateElement.addAttribute(new Attribute("conjunction", "and")); //$NON-NLS-1$ //$NON-NLS-2$
77          innerIterateElement
78                  .addElement(new TextElement(
79                          "$oredCriteria[].criteriaWithSingleValue[].condition$ #oredCriteria[].criteriaWithSingleValue[].value#")); //$NON-NLS-1$
80          isEqualElement.addElement(innerIterateElement);
81  
82          innerIterateElement = new XmlElement("iterate"); //$NON-NLS-1$
83          innerIterateElement.addAttribute(new Attribute("prepend", "and")); //$NON-NLS-1$ //$NON-NLS-2$
84          innerIterateElement.addAttribute(new Attribute(
85                  "property", "oredCriteria[].criteriaWithListValue")); //$NON-NLS-1$ //$NON-NLS-2$
86          innerIterateElement.addAttribute(new Attribute("conjunction", "and")); //$NON-NLS-1$ //$NON-NLS-2$
87          innerIterateElement.addElement(new TextElement(
88                  "$oredCriteria[].criteriaWithListValue[].condition$")); //$NON-NLS-1$
89          XmlElement innerInnerIterateElement = new XmlElement("iterate"); //$NON-NLS-1$
90          innerInnerIterateElement.addAttribute(new Attribute("property", //$NON-NLS-1$
91                  "oredCriteria[].criteriaWithListValue[].values")); //$NON-NLS-1$
92          innerInnerIterateElement.addAttribute(new Attribute("open", "(")); //$NON-NLS-1$ //$NON-NLS-2$
93          innerInnerIterateElement.addAttribute(new Attribute("close", ")")); //$NON-NLS-1$ //$NON-NLS-2$
94          innerInnerIterateElement
95                  .addAttribute(new Attribute("conjunction", ",")); //$NON-NLS-1$ //$NON-NLS-2$
96          innerInnerIterateElement.addElement(new TextElement(
97                  "#oredCriteria[].criteriaWithListValue[].values[]#")); //$NON-NLS-1$
98          innerIterateElement.addElement(innerInnerIterateElement);
99          isEqualElement.addElement(innerIterateElement);
100 
101         innerIterateElement = new XmlElement("iterate"); //$NON-NLS-1$
102         innerIterateElement.addAttribute(new Attribute("prepend", "and")); //$NON-NLS-1$ //$NON-NLS-2$
103         innerIterateElement.addAttribute(new Attribute(
104                 "property", "oredCriteria[].criteriaWithBetweenValue")); //$NON-NLS-1$ //$NON-NLS-2$
105         innerIterateElement.addAttribute(new Attribute("conjunction", "and")); //$NON-NLS-1$ //$NON-NLS-2$
106         innerIterateElement.addElement(new TextElement(
107                 "$oredCriteria[].criteriaWithBetweenValue[].condition$")); //$NON-NLS-1$
108         innerIterateElement.addElement(new TextElement(
109                 "#oredCriteria[].criteriaWithBetweenValue[].values[0]# and")); //$NON-NLS-1$
110         innerIterateElement.addElement(new TextElement(
111                 "#oredCriteria[].criteriaWithBetweenValue[].values[1]#")); //$NON-NLS-1$
112         isEqualElement.addElement(innerIterateElement);
113 
114         // if any of the columns have a user defined type handler, then we need
115         // to add additional inner iterate elements that specify the type
116         // handler
117         for (IntrospectedColumn introspectedColumn : introspectedTable
118                 .getNonBLOBColumns()) {
119             if (stringHasValue(introspectedColumn
120                     .getTypeHandler())) {
121                 // name the property based on the column name, then
122                 // add the type handler to the parameter declaration
123                 StringBuilder sb1 = new StringBuilder();
124                 StringBuilder sb2 = new StringBuilder();
125                 innerIterateElement = new XmlElement("iterate"); //$NON-NLS-1$
126                 innerIterateElement
127                         .addAttribute(new Attribute("prepend", "and")); //$NON-NLS-1$ //$NON-NLS-2$
128 
129                 sb1.append("oredCriteria[]."); //$NON-NLS-1$
130                 sb1.append(introspectedColumn.getJavaProperty());
131                 sb1.append("CriteriaWithSingleValue"); //$NON-NLS-1$
132 
133                 innerIterateElement.addAttribute(new Attribute(
134                         "property", sb1.toString())); //$NON-NLS-1$
135                 innerIterateElement.addAttribute(new Attribute(
136                         "conjunction", "and")); //$NON-NLS-1$ //$NON-NLS-2$
137 
138                 sb2.append(sb1);
139 
140                 sb1.insert(0, '$');
141                 sb1.append("[].condition$ ");//$NON-NLS-1$
142 
143                 sb2.insert(0, '#');
144                 sb2.append("[].value,handler=");//$NON-NLS-1$
145                 sb2.append(introspectedColumn.getTypeHandler());
146                 sb2.append('#');
147 
148                 sb1.append(sb2);
149 
150                 innerIterateElement.addElement(new TextElement(sb1.toString()));
151                 isEqualElement.addElement(innerIterateElement);
152 
153                 sb1.setLength(0);
154                 sb2.setLength(0);
155                 sb1.append("oredCriteria[]."); //$NON-NLS-1$
156                 sb1.append(introspectedColumn.getJavaProperty());
157                 sb1.append("CriteriaWithListValue"); //$NON-NLS-1$
158 
159                 innerIterateElement = new XmlElement("iterate"); //$NON-NLS-1$
160                 innerIterateElement
161                         .addAttribute(new Attribute("prepend", "and")); //$NON-NLS-1$ //$NON-NLS-2$
162                 innerIterateElement.addAttribute(new Attribute(
163                         "property", sb1.toString())); //$NON-NLS-1$
164                 innerIterateElement.addAttribute(new Attribute(
165                         "conjunction", "and")); //$NON-NLS-1$ //$NON-NLS-2$
166 
167                 sb2.append('$');
168                 sb2.append(sb1);
169                 sb2.append("[].condition$"); //$NON-NLS-1$
170 
171                 innerIterateElement.addElement(new TextElement(sb2.toString()));
172 
173                 sb2.setLength(0);
174                 sb2.append(sb1);
175                 sb2.append("[].values"); //$NON-NLS-1$
176 
177                 innerInnerIterateElement = new XmlElement("iterate"); //$NON-NLS-1$
178                 innerInnerIterateElement.addAttribute(new Attribute("property", //$NON-NLS-1$
179                         sb2.toString()));
180                 innerInnerIterateElement
181                         .addAttribute(new Attribute("open", "(")); //$NON-NLS-1$ //$NON-NLS-2$
182                 innerInnerIterateElement.addAttribute(new Attribute(
183                         "close", ")")); //$NON-NLS-1$ //$NON-NLS-2$
184                 innerInnerIterateElement.addAttribute(new Attribute(
185                         "conjunction", ",")); //$NON-NLS-1$ //$NON-NLS-2$
186 
187                 sb2.setLength(0);
188                 sb2.append('#');
189                 sb2.append(sb1);
190                 sb2.append("[].values[],handler="); //$NON-NLS-1$
191                 sb2.append(introspectedColumn.getTypeHandler());
192                 sb2.append('#');
193 
194                 innerInnerIterateElement.addElement(new TextElement(sb2
195                         .toString()));
196                 innerIterateElement.addElement(innerInnerIterateElement);
197                 isEqualElement.addElement(innerIterateElement);
198 
199                 sb1.setLength(0);
200                 sb2.setLength(0);
201                 sb1.append("oredCriteria[]."); //$NON-NLS-1$
202                 sb1.append(introspectedColumn.getJavaProperty());
203                 sb1.append("CriteriaWithBetweenValue"); //$NON-NLS-1$
204 
205                 innerIterateElement = new XmlElement("iterate"); //$NON-NLS-1$
206                 innerIterateElement
207                         .addAttribute(new Attribute("prepend", "and")); //$NON-NLS-1$ //$NON-NLS-2$
208                 innerIterateElement.addAttribute(new Attribute(
209                         "property", sb1.toString())); //$NON-NLS-1$
210                 innerIterateElement.addAttribute(new Attribute(
211                         "conjunction", "and")); //$NON-NLS-1$ //$NON-NLS-2$
212 
213                 sb2.append('$');
214                 sb2.append(sb1);
215                 sb2.append("[].condition$"); //$NON-NLS-1$
216 
217                 innerIterateElement.addElement(new TextElement(sb2.toString()));
218 
219                 sb2.setLength(0);
220                 sb2.append(sb1);
221 
222                 sb1.insert(0, '#');
223                 sb1.append("[].values[0],handler="); //$NON-NLS-1$
224                 sb1.append(introspectedColumn.getTypeHandler());
225                 sb1.append("# and"); //$NON-NLS-1$
226 
227                 sb2.insert(0, '#');
228                 sb2.append("[].values[1],handler="); //$NON-NLS-1$
229                 sb2.append(introspectedColumn.getTypeHandler());
230                 sb2.append('#');
231 
232                 innerIterateElement.addElement(new TextElement(sb1.toString()));
233                 innerIterateElement.addElement(new TextElement(sb2.toString()));
234                 isEqualElement.addElement(innerIterateElement);
235             }
236         }
237 
238         isEqualElement.addElement(new TextElement(")")); //$NON-NLS-1$
239 
240         if (context.getPlugins()
241                 .sqlMapExampleWhereClauseElementGenerated(answer,
242                         introspectedTable)) {
243             parentElement.addElement(answer);
244         }
245     }
246 }