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.javamapper.elements.sqlprovider;
17  
18  import java.util.Set;
19  import java.util.TreeSet;
20  
21  import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
22  import org.mybatis.generator.api.dom.java.JavaVisibility;
23  import org.mybatis.generator.api.dom.java.Method;
24  import org.mybatis.generator.api.dom.java.Parameter;
25  import org.mybatis.generator.api.dom.java.TopLevelClass;
26  
27  public class ProviderApplyWhereMethodGenerator extends
28          AbstractJavaProviderMethodGenerator {
29  
30      private static final String[] BEGINNING_METHOD_LINES = {
31          "if (example == null) {", //$NON-NLS-1$
32          "return;", //$NON-NLS-1$
33          "}", //$NON-NLS-1$
34          "", //$NON-NLS-1$
35          "String parmPhrase1;", //$NON-NLS-1$
36          "String parmPhrase1_th;", //$NON-NLS-1$
37          "String parmPhrase2;", //$NON-NLS-1$
38          "String parmPhrase2_th;", //$NON-NLS-1$
39          "String parmPhrase3;", //$NON-NLS-1$
40          "String parmPhrase3_th;", //$NON-NLS-1$
41          "if (includeExamplePhrase) {", //$NON-NLS-1$
42          "parmPhrase1 = \"%s #{example.oredCriteria[%d].allCriteria[%d].value}\";", //$NON-NLS-1$
43          "parmPhrase1_th = \"%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}\";", //$NON-NLS-1$
44          "parmPhrase2 = \"%s #{example.oredCriteria[%d].allCriteria[%d].value} and #{example.oredCriteria[%d].criteria[%d].secondValue}\";", //$NON-NLS-1$
45          "parmPhrase2_th = \"%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{example.oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}\";", //$NON-NLS-1$
46          "parmPhrase3 = \"#{example.oredCriteria[%d].allCriteria[%d].value[%d]}\";", //$NON-NLS-1$
47          "parmPhrase3_th = \"#{example.oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}\";", //$NON-NLS-1$
48          "} else {", //$NON-NLS-1$
49          "parmPhrase1 = \"%s #{oredCriteria[%d].allCriteria[%d].value}\";", //$NON-NLS-1$
50          "parmPhrase1_th = \"%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}\";", //$NON-NLS-1$
51          "parmPhrase2 = \"%s #{oredCriteria[%d].allCriteria[%d].value} and #{oredCriteria[%d].criteria[%d].secondValue}\";", //$NON-NLS-1$
52          "parmPhrase2_th = \"%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}\";", //$NON-NLS-1$
53          "parmPhrase3 = \"#{oredCriteria[%d].allCriteria[%d].value[%d]}\";", //$NON-NLS-1$
54          "parmPhrase3_th = \"#{oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}\";", //$NON-NLS-1$
55          "}", //$NON-NLS-1$
56          "", //$NON-NLS-1$
57          "StringBuilder sb = new StringBuilder();", //$NON-NLS-1$
58          "List<Criteria> oredCriteria = example.getOredCriteria();", //$NON-NLS-1$
59          "boolean firstCriteria = true;", //$NON-NLS-1$
60          "for (int i = 0; i < oredCriteria.size(); i++) {", //$NON-NLS-1$
61          "Criteria criteria = oredCriteria.get(i);", //$NON-NLS-1$
62          "if (criteria.isValid()) {", //$NON-NLS-1$
63          "if (firstCriteria) {", //$NON-NLS-1$
64          "firstCriteria = false;", //$NON-NLS-1$
65          "} else {", //$NON-NLS-1$
66          "sb.append(\" or \");", //$NON-NLS-1$
67          "}", //$NON-NLS-1$
68          "", //$NON-NLS-1$        
69          "sb.append('(');", //$NON-NLS-1$
70          "List<Criterion> criterions = criteria.getAllCriteria();", //$NON-NLS-1$
71          "boolean firstCriterion = true;", //$NON-NLS-1$
72          "for (int j = 0; j < criterions.size(); j++) {", //$NON-NLS-1$
73          "Criterion criterion = criterions.get(j);", //$NON-NLS-1$
74          "if (firstCriterion) {", //$NON-NLS-1$
75          "firstCriterion = false;", //$NON-NLS-1$
76          "} else {", //$NON-NLS-1$
77          "sb.append(\" and \");", //$NON-NLS-1$
78          "}", //$NON-NLS-1$
79          "", //$NON-NLS-1$
80          "if (criterion.isNoValue()) {", //$NON-NLS-1$
81          "sb.append(criterion.getCondition());", //$NON-NLS-1$
82          "} else if (criterion.isSingleValue()) {", //$NON-NLS-1$
83          "if (criterion.getTypeHandler() == null) {", //$NON-NLS-1$
84          "sb.append(String.format(parmPhrase1, criterion.getCondition(), i, j));", //$NON-NLS-1$
85          "} else {", //$NON-NLS-1$
86          "sb.append(String.format(parmPhrase1_th, criterion.getCondition(), i, j,criterion.getTypeHandler()));", //$NON-NLS-1$
87          "}", //$NON-NLS-1$
88          "} else if (criterion.isBetweenValue()) {", //$NON-NLS-1$
89          "if (criterion.getTypeHandler() == null) {", //$NON-NLS-1$
90          "sb.append(String.format(parmPhrase2, criterion.getCondition(), i, j, i, j));", //$NON-NLS-1$
91          "} else {", //$NON-NLS-1$
92          "sb.append(String.format(parmPhrase2_th, criterion.getCondition(), i, j, criterion.getTypeHandler(), i, j, criterion.getTypeHandler()));", //$NON-NLS-1$
93          "}", //$NON-NLS-1$
94          "} else if (criterion.isListValue()) {", //$NON-NLS-1$
95          "sb.append(criterion.getCondition());", //$NON-NLS-1$
96          "sb.append(\" (\");", //$NON-NLS-1$
97          "List<?> listItems = (List<?>) criterion.getValue();", //$NON-NLS-1$
98          "boolean comma = false;", //$NON-NLS-1$
99          "for (int k = 0; k < listItems.size(); k++) {", //$NON-NLS-1$
100         "if (comma) {", //$NON-NLS-1$
101         "sb.append(\", \");", //$NON-NLS-1$
102         "} else {", //$NON-NLS-1$
103         "comma = true;", //$NON-NLS-1$
104         "}", //$NON-NLS-1$
105         "if (criterion.getTypeHandler() == null) {", //$NON-NLS-1$
106         "sb.append(String.format(parmPhrase3, i, j, k));", //$NON-NLS-1$
107         "} else {", //$NON-NLS-1$
108         "sb.append(String.format(parmPhrase3_th, i, j, k, criterion.getTypeHandler()));", //$NON-NLS-1$
109         "}", //$NON-NLS-1$
110         "}", //$NON-NLS-1$
111         "sb.append(')');", //$NON-NLS-1$
112         "}", //$NON-NLS-1$
113         "}", //$NON-NLS-1$
114         "sb.append(')');", //$NON-NLS-1$
115         "}", //$NON-NLS-1$
116         "}", //$NON-NLS-1$
117         "" //$NON-NLS-1$
118     };
119     
120     private static final String[] LEGACY_ENDING_METHOD_LINES = {
121         "if (sb.length() > 0) {", //$NON-NLS-1$
122         "WHERE(sb.toString());", //$NON-NLS-1$
123         "}" //$NON-NLS-1$
124     };
125     
126     private static final String[] ENDING_METHOD_LINES = {
127         "if (sb.length() > 0) {", //$NON-NLS-1$
128         "sql.WHERE(sb.toString());", //$NON-NLS-1$
129         "}" //$NON-NLS-1$
130     };
131     
132     public ProviderApplyWhereMethodGenerator(boolean useLegacyBuilder) {
133         super(useLegacyBuilder);
134     }
135 
136     @Override
137     public void addClassElements(TopLevelClass topLevelClass) {
138         Set<String> staticImports = new TreeSet<String>();
139         Set<FullyQualifiedJavaType> importedTypes = new TreeSet<FullyQualifiedJavaType>();
140 
141         if (useLegacyBuilder) {
142         	staticImports.add("org.apache.ibatis.jdbc.SqlBuilder.WHERE"); //$NON-NLS-1$
143         } else {
144         	importedTypes.add(NEW_BUILDER_IMPORT);
145         }
146         
147         importedTypes.add(new FullyQualifiedJavaType(
148                 "java.util.List")); //$NON-NLS-1$
149         
150         FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType(introspectedTable.getExampleType());
151         importedTypes.add(fqjt);
152         importedTypes.add(new FullyQualifiedJavaType(
153                 String.format("%s.Criteria", fqjt.getFullyQualifiedName()))); //$NON-NLS-1$
154         importedTypes.add(new FullyQualifiedJavaType(
155                 String.format("%s.Criterion", fqjt.getFullyQualifiedName()))); //$NON-NLS-1$
156 
157         Method method = new Method("applyWhere"); //$NON-NLS-1$
158         method.setVisibility(JavaVisibility.PROTECTED);
159         if (!useLegacyBuilder) {
160             method.addParameter(new Parameter(NEW_BUILDER_IMPORT, "sql")); //$NON-NLS-1$
161         }
162         method.addParameter(new Parameter(fqjt, "example")); //$NON-NLS-1$
163         method.addParameter(new Parameter(FullyQualifiedJavaType.getBooleanPrimitiveInstance(), "includeExamplePhrase")); //$NON-NLS-1$
164         
165         context.getCommentGenerator().addGeneralMethodComment(method,
166                 introspectedTable);
167         
168         for (String methodLine : BEGINNING_METHOD_LINES) {
169             method.addBodyLine(methodLine);
170         }
171         
172         if (useLegacyBuilder) {
173         	for (String methodLine : LEGACY_ENDING_METHOD_LINES) {
174         		method.addBodyLine(methodLine);
175         	}
176         } else {
177         	for (String methodLine : ENDING_METHOD_LINES) {
178         		method.addBodyLine(methodLine);
179         	}
180         }
181         
182         if (context.getPlugins().providerApplyWhereMethodGenerated(method, topLevelClass,
183                 introspectedTable)) {
184             topLevelClass.addStaticImports(staticImports);
185             topLevelClass.addImportedTypes(importedTypes);
186             topLevelClass.addMethod(method);
187         }
188     }
189 }