论坛首页 Java企业应用论坛

阿里巴巴开源平台新增项目SimpleEL

浏览 48042 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-04-14  
luckne 写道
现在的svn 还能访问吗? 我好想不行。。。想看看code 。。


可以访问:
http://code.alibabatech.com/svn/simpleel/trunk

之前管理员做了大小写调整,请重新访问
0 请登录后投票
   发表时间:2011-04-14   最后修改:2011-04-15
QL主体功能差不多实现了,有一些细节带补充,周末有空就补完。

将会支持SELECT、WHERE、ORDER BY、LIMIT、GROUP BY、聚合函数,动态将QL语句编译为Java代码。

下一步还打算支持DELETE、UPDATE等。

TestCase代码
public class QLServiceTest extends TestCase {
	public static class Person {
		private int age;
		private String name;

		public Person() {
		}

		public Person(int age, String name) {
			this.age = age;
			this.name = name;
		}

		public int getAge() { return age; }

		public void setAge(int age) { this.age = age;}

		public String getName() {return name;}

		public void setName(String name) {this.name = name;}
	}

	public void test_0 () throws Exception {
		QLService service = new QLService();
		
		List<Person> srcCollection = new ArrayList<Person>();
		srcCollection.add(new Person(18, "吴能"));
		srcCollection.add(new Person(27, "刘芒"));
		srcCollection.add(new Person(40, "黄警"));
		srcCollection.add(new Person(50, "夏留"));
		srcCollection.add(new Person(60, "刘晶"));
		srcCollection.add(new Person(33, "石榴姐"));
		
		List<Person> destCollection = new ArrayList<Person>();
		
		Map<String, Object> context = new HashMap<String, Object>();
		context.put("age", 30);
		
		service.select(Person.class, srcCollection, destCollection, "WHERE age > @age ORDER BY age desc LIMIT 1, 2", context);
		Assert.assertEquals(2, destCollection.size());
		Assert.assertEquals("夏留", destCollection.get(0).getName());
		Assert.assertEquals("黄警", destCollection.get(1).getName());
	}
}



动态生成的代码:
package com.alibaba.simpleEL.dialect.ql.gen;

import java.util.*;
import static java.lang.Math.*;
import com.alibaba.simpleEL.Expr;
import static com.alibaba.simpleEL.TypeUtils.*;

public class GenClass_10000 implements Expr {

	public Object eval(Map<String, Object> ctx) {
		List<com.alibaba.simpleEL.dialect.ql.QLServiceTest.Person> _src_ = (List<com.alibaba.simpleEL.dialect.ql.QLServiceTest.Person>) ctx.get("_src_");
		List<com.alibaba.simpleEL.dialect.ql.QLServiceTest.Person> _dest_ = (List<com.alibaba.simpleEL.dialect.ql.QLServiceTest.Person>) ctx.get("_dest_");
		final int offset = 1;
		final int rowCount = 2;

		int rowIndex = 0;
		for (com.alibaba.simpleEL.dialect.ql.QLServiceTest.Person item : _src_) {

			if(item.getAge() > _int(ctx.get("age"))) {
				_dest_.add(item);
			}


		}
		{
			Comparator<com.alibaba.simpleEL.dialect.ql.QLServiceTest.Person> comparator = new Comparator<com.alibaba.simpleEL.dialect.ql.QLServiceTest.Person>() {
				public int compare(com.alibaba.simpleEL.dialect.ql.QLServiceTest.Person a, com.alibaba.simpleEL.dialect.ql.QLServiceTest.Person b) {
					if (a.getAge() > b.getAge()) {
						return -1;
					}
					if (a.getAge() < b.getAge()) {
						return 1;
					}
					return 0;
				}
			};
			Collections.sort(_dest_, comparator);
		}

		for (int i = 0; i < offset && i < _dest_.size(); ++i) {
			_dest_.remove(0);
		}
		while(_dest_.size() > rowCount) {
			_dest_.remove(_dest_.size() - 1);
		}

		return null;
	}

}


测试代码路径:
http://code.alibabatech.com/svn/simpleel/trunk/src/test/java/com/alibaba/simpleEL/dialect/ql/QLServiceTest.java


欢迎围观! 
0 请登录后投票
   发表时间:2011-09-21  
跟MVEL相比有什么优势?
0 请登录后投票
   发表时间:2011-10-07  
动态的把表达式放到java source,然后用jdk 1.6的新特性动态编译成class,这个思路还是比较不错的;发展计划中提到支持“提供SQL风格语法支持的预处理器”不知道这个特性做的怎样了,这个比较有挑战的。看了下代码,发现温少自己在原始的写语法和解析,是否有考虑用antlr来做更方便些!
0 请登录后投票
   发表时间:2011-10-08  
温少
  最好结合一个实际应用来阐述
0 请登录后投票
   发表时间:2011-10-08  
你要告诉我们这个玩意实际作用在什么地方,看了半天实在是没看懂
0 请登录后投票
   发表时间:2012-03-31  
现在又发布了一个新的解析器,不知道哪个更好
0 请登录后投票
   发表时间:2012-04-01  
KimShen 写道
wenshao 写道
KimShen 写道
EL不稀奇,最快的OGNL解析器,来一个?


都说了和JSTL中的EL没任何关系了!!

我说是JSTL的EL了?

还有别的什么el咧,小弟真的不会
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics