package org.crazycake.formSqlBuilder.model; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import org.crazycake.formSqlBuilder.model.enums.Operator; import org.crazycake.formSqlBuilder.utils.ReflectUtils; public class QueryNodeFactory { /** * Create queryNode * @param field * @param rule * @param form * @return * @throws IllegalArgumentException * @throws SecurityException * @throws IllegalAccessException * @throws InvocationTargetException * @throws NoSuchMethodException */ public static QueryNode createQueryNode(String sourceField, Rule rule, Object form) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{ //if operator is IN Object v = ReflectUtils.getValue(form, sourceField); if(rule.getOp()==Operator.IN || rule.getOp()==Operator.NOT_IN){ String vs = (String)v; String[] varray = vs.split(","); ArrayList<Object> vlist = new ArrayList<Object>(); for(String vstr:varray){ vlist.add(vstr); } v = vlist; } //if wildcardTargetField is been assigned String targetField = ""; if(rule.getWildcardTargetField()){ String[] temp = rule.getField().split(":"); String nameExpr = temp[1]; targetField = getWildcardTargetField(nameExpr, sourceField); }else if(rule.getTargetField()!=null){ targetField = rule.getTargetField(); }else{ targetField = sourceField; } //create QueryNode QueryNode node = new QueryNode(targetField,rule.getOp().getSql(),rule.getRel().getSql(), v); return node; } /** * get wildcard field * @param wildcardExpr * @param fieldName * @return */ private static String getWildcardTargetField(String wildcardExpr,String fieldName){ String targetField = ""; int wildcardIndex = wildcardExpr.indexOf("*"); if(wildcardIndex==0){ //begin of line String suffix = wildcardExpr.substring(1); int suffixLen = suffix.length(); targetField = fieldName.substring(0, (fieldName.length()-suffixLen)); }else if(wildcardIndex==(wildcardExpr.length()-1)){ //end of line String prefix = wildcardExpr.substring(0,wildcardExpr.length()-1); targetField = fieldName.substring(prefix.length()); //turn the first character to lower case String firstCharacter = targetField.substring(0,1).toLowerCase(); targetField = firstCharacter + targetField.substring(1, targetField.length()); }else{ //middle of line String[] fixArr = wildcardExpr.split("*"); String prefix = fixArr[0]; String suffix = fixArr[1]; //match! int suffixLen = suffix.length(); targetField = fieldName.substring(prefix.length(),(fieldName.length()-suffixLen)); } return targetField; } }