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
User | Most Recent Commit | # Commits |
---|
Other Committers
User | Most Recent Commit | # Commits |
---|
??????????????????????????????????????????????????????????????????? ??????????????????????????????????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);
+,-,*,/,<,>,<=,>=,==,!=,<>????!=?,%,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;
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());//????
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);
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);
?????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;
}
}
)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]
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);
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
??????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);
???
: ??
: ????
: ??
: ??
@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;
}
@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);
}
????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));
QLExpressRunner?????????????????????????????????????
/**
* ?????????
*/
private boolean isPrecise = false;
????????????????java?float?double?int?long????????????????????????????????? ???????????????BigDecimal????????QLExpress???????????? ???? = ?? * ?? + ???? + ? ??? - ??? * ???? ???????????????????????????????
/**
* ??????????
*/
private boolean isShortCircuit = true;
?????????????????????????????????java??????????????????????????? star>10000 and shoptype in('tmall','juhuasuan') and price between (100,900) ??????? star>10000 ??????????????????????????????????????????????????????
??????:ShortCircuitLogicTest.java
/**
* ?????????????????log???DEBUG??
*/
private boolean isTrace = false;
???????????????????????????????????????
?????
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);
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??????????????????????
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);
?????????????????????????????(+,-,*,/??)??????????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);
QLExpress???????????????????????????????????????
addMacro("????","userDO.userTag &1024 ==1024")
addMacro(String macroName,String express)
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?????????????????????
?????????????????????????????????????????????? ????? ?a+fun1(a)+fun2(a+b)+c.getName()? ?????:a,b,c ?????:fun1,fun2
????????????????
ng[] getOutVarNames(String express);
ng[] getOutFunctionNames(String express);
?????????????ExpressRunner????????????
ng expressString = "for(i=0;i<10;i++){sum=i+1}return sum;";
ructionSet instructionSet = expressRunner.parseInstructionSet(expressString);
?????????????instructionSet??????????execute???
??QLExpress?????????????HashMap????????????????????????????????????????????????????
//?????????????????????????????
InstructionSet getInstructionSetFromLocalCache(String expressString);
//????
void clearExpressCache();
????? 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
????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);
}
??? ??????