package org.crazycake.formSqlBuilder.ruleGenerator; import java.lang.reflect.Field; import java.util.Map; import java.util.TreeMap; import javax.persistence.Column; import org.crazycake.formSqlBuilder.model.Rule; import org.crazycake.formSqlBuilder.model.enums.Operator; import org.crazycake.formSqlBuilder.model.enums.Relation; import org.crazycake.utils.CamelNameUtils; /** * 默认的规则方案实现 * @author alex.yang * */ public class DefaultRuleSchemeGenerator implements IRuleSchemeGenerator { /** * 直接从一个form对象生成queryRule * @param form * @return */ @Override public Map<String, Rule> generateRuleScheme(Object form){ /** * 遍历form所有字段 */ Map<String, Rule> queryRule = new TreeMap<String, Rule>(); Field[] fields = form.getClass().getDeclaredFields(); for (int i = 0; i < fields.length; i++) { String fieldName = fields[i].getName(); //如果等于serialVersionUID就跳过 if("serialVersionUID".equals(fieldName)){ continue; } //get default rule: string => =, not string => like Rule r = getDefaultRule(fields[i]); queryRule.put(fieldName, r); } return queryRule; } /** * 判断某个字段是否是忽略字段 * @param ifields * @param fieldName * @param isIgnored * @return */ private boolean isIgnoredField(String[] ifields, String fieldName) { boolean isIgnored = false; for (int j = 0; j < ifields.length; j++) { String ifield = ifields[j]; if(ifield.equals(fieldName)){ isIgnored = true; break; } } return isIgnored; } /** * 获取基本rule,根据field的类型做不同的判断 * @param field * @return */ private Rule getDefaultRule(Field field){ Rule r = null; if("java.lang.String".equals(field.getType().getName())){ //如果是字符串类型的 r = getStringRule(field); }else{ //不是字符串类型的用eq r = getNoStringRule(field); } return r; } /** * 获取字符串类型的基本rule * @param fieldName * @return */ private Rule getStringRule(Field field){ Rule r = new Rule(); //普通字段 r.setField(field.getName()); //对所有不设条件的字段默认是like操作 r.setOp(Operator.LIKE); r.setRel(Relation.OR); return r; } /** * 猜测字段名 * @param field * @return */ private String guessColumnName(Field field) { String colName = null; Column col = field.getAnnotation(Column.class); if(col != null){ colName = col.name(); } if(colName == null){ colName = CamelNameUtils.camel2underscore(field.getName()); } return colName; } /** * 获取非字符串类型的基本rule * @param fieldName * @return */ private Rule getNoStringRule(Field field){ Rule r = new Rule(); //普通字段 r.setField(field.getName()); //根据属性猜测列名:1. 如果有Column注解就用注解,2. 如果没有就用命名猜测 String colName = guessColumnName(field); //对所有不设条件的字段默认是like操作 r.setOp(Operator.EQUAL); r.setRel(Relation.AND); return r; } }