Operator.java 3.4 KB
Newer Older
T
update  
tianqiao 已提交
1 2
package com.ql.util.express;

3
import com.ql.util.express.config.QLExpressRunStrategy;
T
update  
tianqiao 已提交
4 5 6
import com.ql.util.express.instruction.OperateDataCacheManager;
import com.ql.util.express.instruction.op.OperatorBase;

T
tianqiao 已提交
7 8
import java.util.Date;

T
update  
tianqiao 已提交
9 10 11
/**
 * 操作符的基类
 *
12
 * @author xuannan
T
update  
tianqiao 已提交
13
 */
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
public abstract class Operator extends OperatorBase {
    
    public OperateData executeInner(InstructionSetContext context, ArraySwap list) throws Exception {
        Object[] parameters = new Object[list.length];
        for (int i = 0; i < list.length; i++) {
            if(list.get(i)==null && QLExpressRunStrategy.isAvoidNullPointer()){
                parameters[i] = null;
            }else {
                parameters[i] = list.get(i).getObject(context);
            }
        }
        Object result = this.executeInner(parameters);
        if (result != null && result.getClass().equals(OperateData.class)) {
            throw new Exception("操作符号定义的返回类型错误:" + this.getAliasName());
        }
        if (result == null) {
            //return new OperateData(null,null);
            return OperateDataCacheManager.fetchOperateData(null, null);
        } else {
            //return new OperateData(result,ExpressUtil.getSimpleDataType(result.getClass()));
            return OperateDataCacheManager.fetchOperateData(result, ExpressUtil.getSimpleDataType(result.getClass()));
        }
    }
    
    public abstract Object executeInner(Object[] list) throws Exception;
    
T
update  
tianqiao 已提交
40 41
    /**
     * 进行对象比较
42
     *
T
update  
tianqiao 已提交
43 44
     * @param op1
     * @param op2
T
tianqiao 已提交
45
     * @return 0 等于 ,负数 小于 , 正数 大于
T
update  
tianqiao 已提交
46 47
     * @throws Exception
     */
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
    public static int compareData(Object op1, Object op2) throws Exception {
        
        if(op1 == op2){
            return 0;
        }
        
        int compareResult = -1;
        
        if (op1 instanceof String) {
            compareResult = ((String) op1).compareTo(op2.toString());
        } else if (op2 instanceof String) {
            compareResult = op1.toString().compareTo((String) op2);
        } else if (op1 instanceof Character || op2 instanceof Character) {
            if (op1 instanceof Character && op2 instanceof Character) {
                compareResult = ((Character) op1).compareTo((Character) op2);
            } else if (op1 instanceof Number) {
                compareResult = OperatorOfNumber.compareNumber((Number) op1, (int) ((Character) op2).charValue());
            } else if (op2 instanceof Number) {
                compareResult = OperatorOfNumber.compareNumber((int) ((Character) op1).charValue(), (Number) op2);
            } else {
                throw new Exception(op1 + "和" + op2 + "不能执行compare 操作");
            }
        } else if (op1 instanceof Number && op2 instanceof Number) {
            //数字比较
            compareResult = OperatorOfNumber.compareNumber((Number) op1, (Number) op2);
        } else if ((op1 instanceof Boolean) && (op2 instanceof Boolean)) {
            if (((Boolean) op1).booleanValue() == ((Boolean) op2).booleanValue())
                compareResult = 0;
            else
                compareResult = -1;
        } else if ((op1 instanceof Date) && (op2 instanceof Date)) {
            compareResult = ((Date) op1).compareTo((Date) op2);
        } else
            throw new Exception(op1 + "和" + op2 + "不能执行compare 操作");
        return compareResult;
    }
    
T
update  
tianqiao 已提交
85
}