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.mybatis3.xmlmapper.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      private boolean isForUpdateByExample;
34  
35      public ExampleWhereClauseElementGenerator(boolean isForUpdateByExample) {
36          super();
37          this.isForUpdateByExample = isForUpdateByExample;
38      }
39  
40      @Override
41      public void addElements(XmlElement parentElement) {
42          XmlElement answer = new XmlElement("sql"); //$NON-NLS-1$
43  
44          if (isForUpdateByExample) {
45              answer
46                      .addAttribute(new Attribute(
47                              "id", introspectedTable.getMyBatis3UpdateByExampleWhereClauseId())); //$NON-NLS-1$
48          } else {
49              answer.addAttribute(new Attribute(
50                      "id", introspectedTable.getExampleWhereClauseId())); //$NON-NLS-1$
51          }
52  
53          context.getCommentGenerator().addComment(answer);
54  
55          XmlElement whereElement = new XmlElement("where"); //$NON-NLS-1$
56          answer.addElement(whereElement);
57  
58          XmlElement outerForEachElement = new XmlElement("foreach"); //$NON-NLS-1$
59          if (isForUpdateByExample) {
60              outerForEachElement.addAttribute(new Attribute(
61                      "collection", "example.oredCriteria")); //$NON-NLS-1$ //$NON-NLS-2$
62          } else {
63              outerForEachElement.addAttribute(new Attribute(
64                      "collection", "oredCriteria")); //$NON-NLS-1$ //$NON-NLS-2$
65          }
66          outerForEachElement.addAttribute(new Attribute("item", "criteria")); //$NON-NLS-1$ //$NON-NLS-2$
67          outerForEachElement.addAttribute(new Attribute("separator", "or")); //$NON-NLS-1$ //$NON-NLS-2$
68          whereElement.addElement(outerForEachElement);
69  
70          XmlElement ifElement = new XmlElement("if"); //$NON-NLS-1$
71          ifElement.addAttribute(new Attribute("test", "criteria.valid")); //$NON-NLS-1$ //$NON-NLS-2$
72          outerForEachElement.addElement(ifElement);
73  
74          XmlElement trimElement = new XmlElement("trim"); //$NON-NLS-1$
75          trimElement.addAttribute(new Attribute("prefix", "(")); //$NON-NLS-1$ //$NON-NLS-2$
76          trimElement.addAttribute(new Attribute("suffix", ")")); //$NON-NLS-1$ //$NON-NLS-2$
77          trimElement.addAttribute(new Attribute("prefixOverrides", "and")); //$NON-NLS-1$ //$NON-NLS-2$
78  
79          ifElement.addElement(trimElement);
80  
81          trimElement.addElement(getMiddleForEachElement(null));
82  
83          for (IntrospectedColumn introspectedColumn : introspectedTable
84                  .getNonBLOBColumns()) {
85              if (stringHasValue(introspectedColumn
86                      .getTypeHandler())) {
87                  trimElement
88                          .addElement(getMiddleForEachElement(introspectedColumn));
89              }
90          }
91  
92          if (context.getPlugins()
93                  .sqlMapExampleWhereClauseElementGenerated(answer,
94                          introspectedTable)) {
95              parentElement.addElement(answer);
96          }
97      }
98  
99      private XmlElement getMiddleForEachElement(
100             IntrospectedColumn introspectedColumn) {
101         StringBuilder sb = new StringBuilder();
102         String criteriaAttribute;
103         boolean typeHandled;
104         String typeHandlerString;
105         if (introspectedColumn == null) {
106             criteriaAttribute = "criteria.criteria"; //$NON-NLS-1$
107             typeHandled = false;
108             typeHandlerString = null;
109         } else {
110             sb.setLength(0);
111             sb.append("criteria."); //$NON-NLS-1$
112             sb.append(introspectedColumn.getJavaProperty());
113             sb.append("Criteria"); //$NON-NLS-1$
114             criteriaAttribute = sb.toString();
115 
116             typeHandled = true;
117 
118             sb.setLength(0);
119             sb.append(",typeHandler="); //$NON-NLS-1$
120             sb.append(introspectedColumn.getTypeHandler());
121             typeHandlerString = sb.toString();
122         }
123 
124         XmlElement middleForEachElement = new XmlElement("foreach"); //$NON-NLS-1$
125         middleForEachElement.addAttribute(new Attribute(
126                 "collection", criteriaAttribute)); //$NON-NLS-1$
127         middleForEachElement.addAttribute(new Attribute("item", "criterion")); //$NON-NLS-1$ //$NON-NLS-2$
128 
129         XmlElement chooseElement = new XmlElement("choose"); //$NON-NLS-1$
130         middleForEachElement.addElement(chooseElement);
131 
132         XmlElement when = new XmlElement("when"); //$NON-NLS-1$
133         when.addAttribute(new Attribute("test", "criterion.noValue")); //$NON-NLS-1$ //$NON-NLS-2$
134         when.addElement(new TextElement("and ${criterion.condition}")); //$NON-NLS-1$
135         chooseElement.addElement(when);
136 
137         when = new XmlElement("when"); //$NON-NLS-1$
138         when.addAttribute(new Attribute("test", "criterion.singleValue")); //$NON-NLS-1$ //$NON-NLS-2$
139         sb.setLength(0);
140         sb.append("and ${criterion.condition} #{criterion.value"); //$NON-NLS-1$
141         if (typeHandled) {
142             sb.append(typeHandlerString);
143         }
144         sb.append('}');
145         when.addElement(new TextElement(sb.toString()));
146         chooseElement.addElement(when);
147 
148         when = new XmlElement("when"); //$NON-NLS-1$
149         when.addAttribute(new Attribute("test", "criterion.betweenValue")); //$NON-NLS-1$ //$NON-NLS-2$
150         sb.setLength(0);
151         sb.append("and ${criterion.condition} #{criterion.value"); //$NON-NLS-1$
152         if (typeHandled) {
153             sb.append(typeHandlerString);
154         }
155         sb.append("} and #{criterion.secondValue"); //$NON-NLS-1$
156         if (typeHandled) {
157             sb.append(typeHandlerString);
158         }
159         sb.append('}');
160         when.addElement(new TextElement(sb.toString()));
161         chooseElement.addElement(when);
162 
163         when = new XmlElement("when"); //$NON-NLS-1$
164         when.addAttribute(new Attribute("test", "criterion.listValue")); //$NON-NLS-1$ //$NON-NLS-2$
165         when.addElement(new TextElement("and ${criterion.condition}")); //$NON-NLS-1$
166         XmlElement innerForEach = new XmlElement("foreach"); //$NON-NLS-1$
167         innerForEach
168                 .addAttribute(new Attribute("collection", "criterion.value")); //$NON-NLS-1$ //$NON-NLS-2$
169         innerForEach.addAttribute(new Attribute("item", "listItem")); //$NON-NLS-1$ //$NON-NLS-2$
170         innerForEach.addAttribute(new Attribute("open", "(")); //$NON-NLS-1$ //$NON-NLS-2$
171         innerForEach.addAttribute(new Attribute("close", ")")); //$NON-NLS-1$ //$NON-NLS-2$
172         innerForEach.addAttribute(new Attribute("separator", ",")); //$NON-NLS-1$ //$NON-NLS-2$
173         sb.setLength(0);
174         sb.append("#{listItem"); //$NON-NLS-1$
175         if (typeHandled) {
176             sb.append(typeHandlerString);
177         }
178         sb.append('}');
179         innerForEach.addElement(new TextElement(sb.toString()));
180         when.addElement(innerForEach);
181         chooseElement.addElement(when);
182 
183         return middleForEachElement;
184     }
185 }