/** * Copyright 2006-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.mybatis.generator.codegen.mybatis3.javamapper.elements.sqlprovider; import java.util.Set; import java.util.TreeSet; import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType; import org.mybatis.generator.api.dom.java.JavaVisibility; import org.mybatis.generator.api.dom.java.Method; import org.mybatis.generator.api.dom.java.Parameter; import org.mybatis.generator.api.dom.java.TopLevelClass; public class ProviderApplyWhereMethodGenerator extends AbstractJavaProviderMethodGenerator { private static final String[] BEGINNING_METHOD_LINES = { "if (example == null) {", //$NON-NLS-1$ "return;", //$NON-NLS-1$ "}", //$NON-NLS-1$ "", //$NON-NLS-1$ "String parmPhrase1;", //$NON-NLS-1$ "String parmPhrase1_th;", //$NON-NLS-1$ "String parmPhrase2;", //$NON-NLS-1$ "String parmPhrase2_th;", //$NON-NLS-1$ "String parmPhrase3;", //$NON-NLS-1$ "String parmPhrase3_th;", //$NON-NLS-1$ "if (includeExamplePhrase) {", //$NON-NLS-1$ "parmPhrase1 = \"%s #{example.oredCriteria[%d].allCriteria[%d].value}\";", //$NON-NLS-1$ "parmPhrase1_th = \"%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}\";", //$NON-NLS-1$ "parmPhrase2 = \"%s #{example.oredCriteria[%d].allCriteria[%d].value} and #{example.oredCriteria[%d].criteria[%d].secondValue}\";", //$NON-NLS-1$ "parmPhrase2_th = \"%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{example.oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}\";", //$NON-NLS-1$ "parmPhrase3 = \"#{example.oredCriteria[%d].allCriteria[%d].value[%d]}\";", //$NON-NLS-1$ "parmPhrase3_th = \"#{example.oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}\";", //$NON-NLS-1$ "} else {", //$NON-NLS-1$ "parmPhrase1 = \"%s #{oredCriteria[%d].allCriteria[%d].value}\";", //$NON-NLS-1$ "parmPhrase1_th = \"%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}\";", //$NON-NLS-1$ "parmPhrase2 = \"%s #{oredCriteria[%d].allCriteria[%d].value} and #{oredCriteria[%d].criteria[%d].secondValue}\";", //$NON-NLS-1$ "parmPhrase2_th = \"%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}\";", //$NON-NLS-1$ "parmPhrase3 = \"#{oredCriteria[%d].allCriteria[%d].value[%d]}\";", //$NON-NLS-1$ "parmPhrase3_th = \"#{oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}\";", //$NON-NLS-1$ "}", //$NON-NLS-1$ "", //$NON-NLS-1$ "StringBuilder sb = new StringBuilder();", //$NON-NLS-1$ "List<Criteria> oredCriteria = example.getOredCriteria();", //$NON-NLS-1$ "boolean firstCriteria = true;", //$NON-NLS-1$ "for (int i = 0; i < oredCriteria.size(); i++) {", //$NON-NLS-1$ "Criteria criteria = oredCriteria.get(i);", //$NON-NLS-1$ "if (criteria.isValid()) {", //$NON-NLS-1$ "if (firstCriteria) {", //$NON-NLS-1$ "firstCriteria = false;", //$NON-NLS-1$ "} else {", //$NON-NLS-1$ "sb.append(\" or \");", //$NON-NLS-1$ "}", //$NON-NLS-1$ "", //$NON-NLS-1$ "sb.append('(');", //$NON-NLS-1$ "List<Criterion> criterions = criteria.getAllCriteria();", //$NON-NLS-1$ "boolean firstCriterion = true;", //$NON-NLS-1$ "for (int j = 0; j < criterions.size(); j++) {", //$NON-NLS-1$ "Criterion criterion = criterions.get(j);", //$NON-NLS-1$ "if (firstCriterion) {", //$NON-NLS-1$ "firstCriterion = false;", //$NON-NLS-1$ "} else {", //$NON-NLS-1$ "sb.append(\" and \");", //$NON-NLS-1$ "}", //$NON-NLS-1$ "", //$NON-NLS-1$ "if (criterion.isNoValue()) {", //$NON-NLS-1$ "sb.append(criterion.getCondition());", //$NON-NLS-1$ "} else if (criterion.isSingleValue()) {", //$NON-NLS-1$ "if (criterion.getTypeHandler() == null) {", //$NON-NLS-1$ "sb.append(String.format(parmPhrase1, criterion.getCondition(), i, j));", //$NON-NLS-1$ "} else {", //$NON-NLS-1$ "sb.append(String.format(parmPhrase1_th, criterion.getCondition(), i, j,criterion.getTypeHandler()));", //$NON-NLS-1$ "}", //$NON-NLS-1$ "} else if (criterion.isBetweenValue()) {", //$NON-NLS-1$ "if (criterion.getTypeHandler() == null) {", //$NON-NLS-1$ "sb.append(String.format(parmPhrase2, criterion.getCondition(), i, j, i, j));", //$NON-NLS-1$ "} else {", //$NON-NLS-1$ "sb.append(String.format(parmPhrase2_th, criterion.getCondition(), i, j, criterion.getTypeHandler(), i, j, criterion.getTypeHandler()));", //$NON-NLS-1$ "}", //$NON-NLS-1$ "} else if (criterion.isListValue()) {", //$NON-NLS-1$ "sb.append(criterion.getCondition());", //$NON-NLS-1$ "sb.append(\" (\");", //$NON-NLS-1$ "List<?> listItems = (List<?>) criterion.getValue();", //$NON-NLS-1$ "boolean comma = false;", //$NON-NLS-1$ "for (int k = 0; k < listItems.size(); k++) {", //$NON-NLS-1$ "if (comma) {", //$NON-NLS-1$ "sb.append(\", \");", //$NON-NLS-1$ "} else {", //$NON-NLS-1$ "comma = true;", //$NON-NLS-1$ "}", //$NON-NLS-1$ "if (criterion.getTypeHandler() == null) {", //$NON-NLS-1$ "sb.append(String.format(parmPhrase3, i, j, k));", //$NON-NLS-1$ "} else {", //$NON-NLS-1$ "sb.append(String.format(parmPhrase3_th, i, j, k, criterion.getTypeHandler()));", //$NON-NLS-1$ "}", //$NON-NLS-1$ "}", //$NON-NLS-1$ "sb.append(')');", //$NON-NLS-1$ "}", //$NON-NLS-1$ "}", //$NON-NLS-1$ "sb.append(')');", //$NON-NLS-1$ "}", //$NON-NLS-1$ "}", //$NON-NLS-1$ "" //$NON-NLS-1$ }; private static final String[] LEGACY_ENDING_METHOD_LINES = { "if (sb.length() > 0) {", //$NON-NLS-1$ "WHERE(sb.toString());", //$NON-NLS-1$ "}" //$NON-NLS-1$ }; private static final String[] ENDING_METHOD_LINES = { "if (sb.length() > 0) {", //$NON-NLS-1$ "sql.WHERE(sb.toString());", //$NON-NLS-1$ "}" //$NON-NLS-1$ }; public ProviderApplyWhereMethodGenerator(boolean useLegacyBuilder) { super(useLegacyBuilder); } @Override public void addClassElements(TopLevelClass topLevelClass) { Set<String> staticImports = new TreeSet<String>(); Set<FullyQualifiedJavaType> importedTypes = new TreeSet<FullyQualifiedJavaType>(); if (useLegacyBuilder) { staticImports.add("org.apache.ibatis.jdbc.SqlBuilder.WHERE"); //$NON-NLS-1$ } else { importedTypes.add(NEW_BUILDER_IMPORT); } importedTypes.add(new FullyQualifiedJavaType( "java.util.List")); //$NON-NLS-1$ FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType(introspectedTable.getExampleType()); importedTypes.add(fqjt); importedTypes.add(new FullyQualifiedJavaType( String.format("%s.Criteria", fqjt.getFullyQualifiedName()))); //$NON-NLS-1$ importedTypes.add(new FullyQualifiedJavaType( String.format("%s.Criterion", fqjt.getFullyQualifiedName()))); //$NON-NLS-1$ Method method = new Method("applyWhere"); //$NON-NLS-1$ method.setVisibility(JavaVisibility.PROTECTED); if (!useLegacyBuilder) { method.addParameter(new Parameter(NEW_BUILDER_IMPORT, "sql")); //$NON-NLS-1$ } method.addParameter(new Parameter(fqjt, "example")); //$NON-NLS-1$ method.addParameter(new Parameter(FullyQualifiedJavaType.getBooleanPrimitiveInstance(), "includeExamplePhrase")); //$NON-NLS-1$ context.getCommentGenerator().addGeneralMethodComment(method, introspectedTable); for (String methodLine : BEGINNING_METHOD_LINES) { method.addBodyLine(methodLine); } if (useLegacyBuilder) { for (String methodLine : LEGACY_ENDING_METHOD_LINES) { method.addBodyLine(methodLine); } } else { for (String methodLine : ENDING_METHOD_LINES) { method.addBodyLine(methodLine); } } if (context.getPlugins().providerApplyWhereMethodGenerated(method, topLevelClass, introspectedTable)) { topLevelClass.addStaticImports(staticImports); topLevelClass.addImportedTypes(importedTypes); topLevelClass.addMethod(method); } } }