alibaba/QLExpress

Name: QLExpress

Owner: Alibaba

Description: QLExpress is a powerful, lightweight, dynamic language for the Java platform aimed at improving developers? productivity in different business scenes.

Created: 2017-03-15 08:39:54.0

Updated: 2018-05-24 12:32:37.0

Pushed: 2018-05-14 07:21:25.0

Homepage: null

Size: 259

Language: Java

GitHub Committers

UserMost Recent Commit# Commits

Other Committers

UserEmailMost Recent Commit# Commits

README

QLExpress????

Join the chat at https://gitter.im/QLExpress/Lobby

??????

??????????????????????????????????????????????????????????????????? ??????????????????????????????????2012????

?????????

endency>
roupId>com.alibaba</groupId>
rtifactId>QLExpress</artifactId>
ersion>3.2.0</version>
pendency>
ava
essRunner runner = new ExpressRunner();
ultContext<String, Object> context = new DefaultContext<String, Object>();
ext.put("a",1);
ext.put("b",2);
ext.put("c",3);
ng express = "a+b*c";
ct r = runner.execute(express, context, null, true, false);
em.out.println(r);

??????

1?????java????
??java??
 +,-,*,/,<,>,<=,>=,==,!=,<>????!=?,%,mod??????%?,++,--,
???sql?,like?sql???,&&,||,!,????
for?break?continue?if then else ??????????
;
sum=0,i=0;i<n;i++){
sum+i;

rn sum;



????


= a>b?a:b;
java?????
rt com.ql.util.express.test.OrderQuery;
???import java.lang.*,import java.util.*;


y = new OrderQuery();//??class??,???classLoader??????????
y.setCreateDate(new Date());//????
y.buyer = "??";//????,??????setBuyer("??")
lt = bizOrderDAO.query(query);//??bean?????
em.out.println(result.getId());//????
2??????function
tion add(int a,int b){
turn a+b;


tion sub(int a,int b){
turn a - b;


;
rn add(a,4) + sub(a,9);
3???????Operator
??if then else ????
er.addOperatorWithAlias("??", "if",null);
er.addOperatorWithAlias("?", "then",null);
er.addOperatorWithAlias("??", "else",null);

= "??  (?? 1==2 ? false ?? true) ? {2+2;} ?? {20 + 20;}";
ultContext<String, Object> context = new DefaultContext<String, Object>();
er.execute(exp,nil,null,false,false,null);
?????Operator
?????com.ql.util.express.Operator????
ic class JoinOperator extends Operator{
public Object executeInner(Object[] list) throws Exception {
    Object opdata1 = list[0];
    Object opdata2 = list[1];
    if(opdata1 instanceof java.util.List){
        ((java.util.List)opdata1).add(opdata2);
        return opdata1;
    }else{
        java.util.List result = new java.util.ArrayList();
        result.add(opdata1);
        result.add(opdata2);
        return result;              
    }
}

????Operator
)addOperator
essRunner runner = new ExpressRunner();
ultContext<String, Object> context = new DefaultContext<String, Object>();
er.addOperator("join",new JoinOperator());
ct r = runner.execute("1 join 2 join 3", context, null, false, false);
em.out.println(r);
??  [1, 2, 3]

)replaceOperator
essRunner runner = new ExpressRunner();
ultContext<String, Object> context = new DefaultContext<String, Object>();
er.replaceOperator("+",new JoinOperator());
ct r = runner.execute("1 + 2 + 3", context, null, false, false);
em.out.println(r);
??  [1, 2, 3]

)addFunction
essRunner runner = new ExpressRunner();
ultContext<String, Object> context = new DefaultContext<String, Object>();
er.addFunction("join",new JoinOperator());
ct r = runner.execute("join(1,2,3)", context, null, false, false);
em.out.println(r);
??  [1, 2, 3]
4???java??????method

addFunctionOfClassMethod+addFunctionOfServiceMethod

ic class BeanExample {
public static String upper(String abc) {
    return abc.toUpperCase();
}
public boolean anyContains(String str, String searchStr) {

    char[] s = str.toCharArray();
    for (char c : s) {
        if (searchStr.contains(c+"")) {
            return true;
        }
    }
    return false;
}


er.addFunctionOfClassMethod("????", Math.class.getName(), "abs",
            new String[] { "double" }, null);
er.addFunctionOfClassMethod("?????", BeanExample.class.getName(),
            "upper", new String[] { "String" }, null);

er.addFunctionOfServiceMethod("??", System.out, "println",new String[] { "String" }, null);
er.addFunctionOfServiceMethod("contains", new BeanExample(), "anyContains",
        new Class[] { String.class, String.class }, null);

ng exp = ?????(-100);?????(\"hello world\");??(\"????\");contains("helloworld",\"aeiou\")?;
er.execute(exp, context, null, false, false);
5?macro ???
er.addMacro("??????", "(??+??+??)/3.0");
er.addMacro("????", "??????>90");
ressContext<String, Object> context =new DefaultContext<String, Object>();
ext.put("??", 88);
ext.put("??", 99);
ext.put("??", 95);
ct result = runner.execute("????", context, null, false, false);
em.out.println(r);
??true
6?????????????????????

??????int???int???

ng express = "int ??? = (??+??+??+????.??2)/4.0;return ???";
essRunner runner = new ExpressRunner(true,true);
ng[] names = runner.getOutVarNames(express);
String s:names){
tem.out.println("var : " + s);


???

: ??
: ????
: ??
: ??
7??????????
@Test
public void testMethodReplace() throws Exception {
    ExpressRunner runner = new ExpressRunner();
    IExpressContext<String,Object> expressContext = new DefaultContext<String,Object>();
    runner.addFunctionOfServiceMethod("getTemplate", this, "getTemplate", new Class[]{Object[].class}, null);

    //(1)????????????????
    Object r = runner.execute("getTemplate([11,'22',33L,true])", expressContext, null,false, false);
    System.out.println(r);
    //(2)?java??,??????????,??????????,?????????
    DynamicParamsUtil.supportDynamicParams = true;
    r = runner.execute("getTemplate(11,'22',33L,true)", expressContext, null,false, false);
    System.out.println(r);
}
//???getTemplate(Object[] params)
public Object getTemplate(Object... params) throws Exception{
    String result = "";
    for(Object obj:params){
        result = result+obj+",";
    }
    return result;
}
8??????????
@Test
public void testSet() throws Exception {
    ExpressRunner runner = new ExpressRunner(false,false);
    DefaultContext<String, Object> context = new DefaultContext<String, Object>();
    String express = "abc = NewMap(1:1,2:2); return abc.get(1) + abc.get(2);";
    Object r = runner.execute(express, context, null, false, false);
    System.out.println(r);
    express = "abc = NewList(1,2,3); return abc.get(1)+abc.get(2)";
    r = runner.execute(express, context, null, false, false);
    System.out.println(r);
    express = "abc = [1,2,3]; return abc[1]+abc[2];";
    r = runner.execute(express, context, null, false, false);
    System.out.println(r);
}
9??????

????java??????ql???for(obj:list){}?????????????

??map
p = new HashMap();
p.put("a", "a_value");
p.put("b", "b_value");
ySet = map.keySet();
jArr = keySet.toArray();
r (i=0;i<objArr.length;i++) {
y = objArr[i];
ystem.out.println(map.get(key));

???????API????

QLExpressRunner?????????????????????????????????????

QlExpress-detail.jpg

1?????
isPrecise
/**
 * ?????????
 */
private boolean isPrecise = false;

????????????????java?float?double?int?long????????????????????????????????? ???????????????BigDecimal????????QLExpress???????????? ???? = ?? * ?? + ???? + ? ??? - ??? * ???? ???????????????????????????????

isShortCircuit
/**
 * ??????????
 */
private boolean isShortCircuit = true;

?????????????????????????????????java??????????????????????????? star>10000 and shoptype in('tmall','juhuasuan') and price between (100,900) ??????? star>10000 ??????????????????????????????????????????????????????

??????:ShortCircuitLogicTest.java

isTrace
/**
 * ?????????????????log???DEBUG??
 */
private boolean isTrace = false;

???????????????????????????????????????

2?????

?????
param expressString ????
param context ?????????????ApplicationContext
param errorList ???????List
param isCache ????Cache?????,???true
param isTrace ?????????????????false
param aLog ???log
return
throws Exception

Object execute(String expressString, IExpressContext<String,Object> context,List<String> errorList, boolean isCache, boolean isTrace, Log aLog);
3?????API??

QLExpress????????Operator.java?????????????????????????addFunction??addOperator??????ExpressRunner??

public abstract Object executeInner(Object[] list) throws Exception;

???????????????????????????join???:

list = 1 join 2 join 3; -> [1,2,3] list = join(list,4,5,6); -> [1,2,3,4,5,6]

ic class JoinOperator extends Operator{
public Object executeInner(Object[] list) throws Exception {
    java.util.List result = new java.util.ArrayList();
    Object opdata1 = list[0];
    if(opdata1 instanceof java.util.List){
       result.addAll((java.util.List)opdata1);
    }else{
        result.add(opdata1);
    }
    for(int i=1;i<list.length;i++){
       result.add(list[i]);
    }
    return result;
}

?????Operator???OperatorBase.java??????????????????????

?1?function??API
name??function???
atorBase getFunciton(String name);

????Operator??????fun(a,b,c)
 addFunction(String name, OperatorBase op);
n(a,b,c) ?? object.function(a,b,c)????
 addFunctionOfServiceMethod(String name, Object aServiceObject,
        String aFunctionName, Class<?>[] aParameterClassTypes,
        String errorInfo);
n(a,b,c) ?? Class.function(a,b,c)???
 addFunctionOfClassMethod(String name, String aClassName,
        String aFunctionName, Class<?>[] aParameterClassTypes,
        String errorInfo);
lass??????method??? ??a.fun(b) ?fun(a,b) ??????
??String.class?isBlank??:?abc?.isBlank()?isBlank("abc")?????
 addFunctionAndClassMethod(String name,Class<?>bindingClass, OperatorBase op);
?2?Operator??API

?????????????????????????????(+,-,*,/??)??????????QLExpress????????

//??????,???????
 addOperator(String name,Operator op);
 addOperator(String name,String aRefOpername,Operator op);

//???????
atorBase replaceOperator(String name,OperatorBase op);

??????????????? if..then..else -> ????????????
 addOperatorWithAlias(String keyWordName, String realKeyWordName,
        String errorInfo);
?3??????API

QLExpress???????????????????????????????????????

addMacro("????","userDO.userTag &1024 ==1024")
 addMacro(String macroName,String express) 
?4?java class???api

QLExpress?????java?????????method?field??? ?????“list.join(“1”).join(“2”)“????????“list.??”?

??????
 addClassField(String field,Class<?>bindingClass,Class<?>returnType,Operator op);

????
 addClassMethod(String name,Class<?>bindingClass,OperatorBase op);

????????????????????????????????????????????????????????jvm?????????????????????

?4????????????API

?????????????????????????????????????????????? ????? ?a+fun1(a)+fun2(a+b)+c.getName()? ?????:a,b,c ?????:fun1,fun2

????????????????
ng[] getOutVarNames(String express);

ng[] getOutFunctionNames(String express);
?5???????api

?????????????ExpressRunner????????????

ng expressString = "for(i=0;i<10;i++){sum=i+1}return sum;";
ructionSet instructionSet = expressRunner.parseInstructionSet(expressString);
?????????????instructionSet??????????execute???
?6?????????api

??QLExpress?????????????HashMap????????????????????????????????????????????????????

//?????????????????????????????
InstructionSet getInstructionSetFromLocalCache(String expressString);
//????
void clearExpressCache();
?6????????Context???api
6.1 ?spring???????

????? IExpressContext context ????????put????????????????

?????????????????spring????????????????????

ic class QLExpressContext extends HashMap<String, Object> implements
    IExpressContext<String, Object> {

private ApplicationContext context;

//???????context? ApplicationContext
public QLExpressContext(Map<String, Object> map,
                        ApplicationContext aContext) {
    super(map);
    this.context = aContext;
}

/**
 * ????????????????????
 */
public Object get(Object name) {
    Object result = null;
    result = super.get(name);
    try {
        if (result == null && this.context != null
                && this.context.containsBean((String) name)) {
            // ???Spring?????bean????String?Bean
            result = this.context.getBean((String) name);
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    return result;
}

public Object put(String name, Object object) {
    return super.put(name, object);
}


???demo?? SpringDemoTest.java

6.2 ?????????????context?????

????Operator??????OperatorBase????parent?????????????????????????????????????????

ic class ContextMessagePutTest {


class OperatorContextPut extends OperatorBase {

    public OperatorContextPut(String aName) {
        this.name = aName;
    }

    @Override
    public OperateData executeInner(InstructionSetContext parent, ArraySwap list) throws Exception {
        String key = list.get(0).toString();
        Object value = list.get(1);
        parent.put(key,value);
        return null;
    }
}

@Test
public void test() throws Exception{
    ExpressRunner runner = new ExpressRunner();
    OperatorBase op = new OperatorContextPut("contextPut");
    runner.addFunction("contextPut",op);
    String exp = "contextPut('success','false');contextPut('error','????');contextPut('warning','????')";
    IExpressContext<String, Object> context = new DefaultContext<String, Object>();
    context.put("success","true");
    Object result = runner.execute(exp,context,null,false,true);
    System.out.println(result);
    System.out.println(context);
}

??? ??????

links for us

This work is supported by the National Institutes of Health's National Center for Advancing Translational Sciences, Grant Number U24TR002306. This work is solely the responsibility of the creators and does not necessarily represent the official views of the National Institutes of Health.