- 浏览: 273752 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
highphd:
海量用户如何处理啊?缓存服务器?大数据?
面向海量服务的设计原则和策略总结 -
AKka:
看了这篇博文更感觉到自己要学的东西更多了。同时感谢博主的辛勤写 ...
[Java性能剖析]JVM Management API -
sswh:
非常不错,感谢分享!!
[Java性能剖析]Sun JVM Attach API -
muyexi:
请问在Android开发中的什么场景下,会用到ObjectWe ...
[字节码系列]ObjectWeb ASM构建Method Monitor -
zoutuo:
前辈可否告知其中的“吞吐量”指的是什么?谢谢!
[Java性能剖析]Sun JVM内存管理和垃圾回收
一、效果
二、基本接口
三、实现
java 代码
- public class HqlCompilerImplTest extends TestCase
- {
- private IHqlCompiler compiler = new HqlCompilerImpl();
- public void test1()
- {
- Hql hql = compiler.compile("from User u where u.username = :username and u.age = :age order by u.username,u.age",
- new MapContext());
- assertEquals("from User u order by u.username,u.age", hql.getHql());
- assertEquals(0, hql.getParameters().length);
- }
- public void test2)
- {
- MapContext context = new MapContext();
- context.add("username", "ray");
- Hql hql = compiler
- .compile(
- "from User u where u.username = :username and u.age = :age order by u.username,u.age",
- context);
- assertEquals(
- "from User u where u.username = :username order by u.username,u.age",
- hql.getHql());
- assertEquals(1, hql.getParameters().length);
- assertEquals("username", hql.getParameters()[0].getName());
- assertEquals("ray", hql.getParameters()[0].getValue());
- }
- public void test3()
- {
- MapContext context = new MapContext();
- context.add("username", "ray");
- context.add("age", new Integer(10));
- Hql hql = compiler
- .compile(
- "from User u where u.username = :username and u.age = :age order by u.username,u.age",
- context);
- assertEquals(
- "from User u where (u.username = :username and u.age = :age) order by u.username,u.age",
- hql.getHql());
- assertEquals(2, hql.getParameters().length);
- assertEquals("username", hql.getParameters()[0].getName());
- assertEquals("ray", hql.getParameters()[0].getValue());
- assertEquals("age", hql.getParameters()[1].getName());
- assertEquals(new Integer(10), hql.getParameters()[1].getValue());
- }
- }
二、基本接口
java 代码
- package com.ayufox.framework.core;
- /**
- * @author ray
- *
- */
- public interface Context
- {
- Object get(String name);
- }
java 代码
- package com.ayufox.framework.core.dao.hqlx;
- import com.ayufox.framework.core.Context;
- import com.ayufox.framework.core.dao.hql.Hql;
- /**
- * @author ray
- *
- */
- public interface IHqlCompiler
- {
- Hql compile(String hql, Object ... values);
- Hql compile(String hql, Context context);
- }
java 代码
- package com.ayufox.framework.core.dao.hqlx.ast;
- import java.io.ByteArrayOutputStream;
- import java.io.PrintStream;
- import java.util.Collections;
- import java.util.HashMap;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.hibernate.hql.ast.HqlParser;
- import antlr.RecognitionException;
- import antlr.TokenStreamException;
- import antlr.collections.AST;
- import com.ayufox.framework.core.Context;
- import com.ayufox.framework.core.cache.Cache;
- import com.ayufox.framework.core.cache.MapCache;
- import com.ayufox.framework.core.dao.hql.Hql;
- import com.ayufox.framework.core.dao.hqlx.DynamicMapContext;
- import com.ayufox.framework.core.dao.hqlx.IHqlCompiler;
- import com.ayufox.framework.core.dao.hqlx.IllegalSyntaxException;
- /**
- * @author ray
- *
- */
- public class HqlCompilerImpl implements IHqlCompiler
- {
- private final static Log LOG = LogFactory.getLog(HqlCompilerImpl.class);
- private Cache astCache = new MapCache(Collections
- .synchronizedMap(new HashMap()));
- public void setAstCache(Cache astCache)
- {
- this.astCache = astCache;
- }
- /* (non-Javadoc)
- * @see com.konceptusa.framework.core.dao.hqlx.IHqlCompiler#compile(java.lang.String, java.lang.Object[])
- */
- public Hql compile(String hql, Object... values)
- {
- return compile(hql, new DynamicMapContext(values));
- }
- /* (non-Javadoc)
- * @see com.konceptusa.framework.core.dao.hqlx.IHqlCompiler#compile(java.lang.String, com.konceptusa.framework.core.Context)
- */
- public Hql compile(String hql, Context context)
- {
- if (hql == null || context == null)
- {
- throw new IllegalArgumentException("hql or context can't be null");
- }
- AST ast = getRootAST(hql);
- HqlCompileExecutor compilerContext = new HqlCompileExecutor(ast,
- context);
- return compilerContext.build();
- }
- protected AST getRootAST(String hql)
- {
- AST ast = (AST) this.astCache.get(hql);
- if (ast == null)
- {
- ast = createAST(hql);
- this.astCache.put(hql, ast);
- if (LOG.isDebugEnabled())
- {
- LOG.debug("get ast[" + ast + "] from cache for hql[" + hql
- + "]");
- }
- }
- return ast;
- }
- private AST createAST(String hql)
- {
- HqlParser parser = HqlParser.getInstance(hql);
- try
- {
- parser.statement();
- }
- catch (RecognitionException e)
- {
- throw new IllegalSyntaxException(e);
- }
- catch (TokenStreamException e)
- {
- throw new IllegalSyntaxException(e);
- }
- AST ast = parser.getAST();
- parser.getParseErrorHandler().throwQueryException();
- if (LOG.isDebugEnabled())
- {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- parser.showAst(ast, new PrintStream(baos));
- LOG.debug("AST:" + new String(baos.toByteArray()));
- }
- return ast;
- }
- }
评论
3 楼
onlyerlee
2007-09-27
能把源码发到我邮箱里来吗?我想运行下知道是怎样的效果. onlyerli@ecvision.com
2 楼
pigfly
2007-05-27
这样还是要自己写hql语句,可不可以根据结果集合自动拼凑hql呢
1 楼
ayufox
2007-05-25
package com.ayufox.framework.core.dao.hqlx.ast; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.hql.antlr.SqlTokenTypes; import antlr.collections.AST; import com.ayufox.framework.core.Context; import com.ayufox.framework.core.common.CommonUtils; import com.ayufox.framework.core.dao.hql.Hql; import com.ayufox.framework.core.dao.hql.Parameter; /** * @author ray * */ public class HqlCompileExecutor implements SqlTokenTypes { private final static Log LOG = LogFactory.getLog(HqlCompileExecutor.class); private final static Map NODE_TYPE_MAP = new HashMap(); static { Field[] fields = SqlTokenTypes.class.getFields(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; int modifiers = field.getModifiers(); if (Modifier.isPublic(modifiers) && Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) { String name = field.getName(); try { Object value = field.get(null); NODE_TYPE_MAP.put(value, name); } catch (IllegalAccessException ex) { LOG.error("Imposible", ex); } } } } protected Hql hql; protected List<Parameter> parameters; protected Context context; private AST root; public HqlCompileExecutor(AST root, Context context) { init(root, context); } protected HqlCompileExecutor() { } protected void init(AST root, Context context) { this.context = context; this.root = root; this.parameters = new ArrayList<Parameter>(); } public Hql build() { if (this.hql == null) { String hql = buildHql(); if (LOG.isDebugEnabled()) { LOG.debug("hql:" + hql); for (int i = 0; i < this.parameters.size(); i++) { LOG.debug(" parameter[" + i + "]:name=[" + this.parameters.get(i).getName() + "],value=[" + this.parameters.get(i).getValue() + "]"); } } this.hql = new Hql(hql, this.parameters .toArray(new Parameter[this.parameters.size()])); } return this.hql; } protected String buildHql() { StringBuffer buffer = new StringBuffer(); print(buffer, this.root); return buffer.toString(); } protected void print(StringBuffer buffer, AST ast) { switch (ast.getType()) { case QUERY: //查询根节点 printChildren(buffer, ast, " "); break; case RANGE: //FROM根节点 printRANGE(buffer, ast); break; case IDENT: case ALIAS: case ROW_STAR: //* case DISTINCT: case ALL: case NUM_INT: case NUM_DOUBLE: case NUM_FLOAT: case NUM_LONG: printText(buffer, ast); break; case INNER: case OUTER: case FULL: case LEFT: case RIGHT: printText(buffer, ast); buffer.append(" join"); break; case JOIN: printJOIN(buffer, ast); break; case FROM: printSelfAndChildren(buffer, ast, " "); break; case SELECT: printSelfAndChildren(buffer, ast, ","); break; case SELECT_FROM: printSELECT_FROM(buffer, ast); break; case COUNT: case AGGREGATE: //聚合函数 printFunction(buffer, ast); break; case DOT: //. printDOT(buffer, ast); break; case AND: case OR: printLinkWord(buffer, ast); break; case WHERE: printWhere(buffer, ast); break; case CONSTRUCTOR: printCONSTRUCTOR(buffer, ast); break; case LIKE: case NOT_LIKE: case EQ: case GT: case GE: case LT: case LE: case IN: case NOT_IN: printCondition(buffer, ast); break; case BETWEEN: case NOT_BETWEEN: printBETWEEN(buffer, ast); break; case IN_LIST: //in printInList(buffer, ast); break; case COLON: //: printCOLON(buffer, ast); break; case ORDER: printORDER(buffer, ast); break; case GROUP: buffer.append("group by "); printChildren(buffer, ast, ","); break; case ASCENDING: case DESCENDING: printText(buffer, ast); break; default: LOG.warn("Incognizance node, type[" + NODE_TYPE_MAP.get(ast.getType()) + "(" + ast.getType() + ")] text[" + ast.getText() + "]"); } } protected void printCONSTRUCTOR(StringBuffer buffer, AST ast) { buffer.append("new "); AST constructor = ast.getFirstChild(); print(buffer, constructor); buffer.append('('); AST next = constructor.getNextSibling(); while (next != null) { if (buffer.charAt(buffer.length()-1) != '(') { buffer.append(','); } print(buffer, next); next = next.getNextSibling(); } buffer.append(')'); } protected void printORDER(StringBuffer buffer, AST ast) { buffer.append("order by "); AST child = ast.getFirstChild(); AST next = null; while (child != null) { print(buffer, child); next = child.getNextSibling(); if (next != null) { if (next.getType() == DESCENDING || next.getType() == ASCENDING) { buffer.append(" "); } else { buffer.append(","); } } child = next; } } protected void printRANGE(StringBuffer buffer, AST ast) { printChildren(buffer, ast, " "); AST next = ast.getNextSibling(); if (next != null && next.getType() == RANGE) { buffer.append(","); } } protected void printInList(StringBuffer buffer, AST ast) { buffer.append("("); printChildren(buffer, ast, ""); buffer.append(")"); } protected void printWhere(StringBuffer buffer, AST ast) { //where节点下只有一个子节点 int length = buffer.length(); AST child = ast.getFirstChild(); print(buffer, child); if (buffer.length() > length) { buffer.insert(length, ast.getText() + " "); } } /* * 连接词,即and和or */ protected void printLinkWord(StringBuffer buffer, AST ast) { int sourceLength = buffer.length(); AST left = ast.getFirstChild(); AST right = left.getNextSibling(); print(buffer, left); int middleLength = buffer.length(); print(buffer, right); int allLength = buffer.length(); //or/and的左表达式和右表达式都存在,需要加上括号和连接词 if ((allLength > middleLength) && (middleLength > sourceLength)) { buffer.insert(sourceLength, "("); buffer.insert(middleLength + 1, " " + ast.getText() + " "); buffer.append(")"); } } /* * : */ protected void printCOLON(StringBuffer buffer, AST ast) { int length = buffer.length(); printChildren(buffer, ast, ""); String name = buffer.substring(length, buffer.length()).replace('_', '.'); Object value = context.get(name); if (CommonUtils.isEmpty(value)) { throw new ValueNotExistException(name); } buffer.insert(length, ast.getText()); this.parameters.add(new Parameter(name, value)); } protected void printText(StringBuffer buffer, AST ast) { buffer.append(ast.getText()); } /* * 函数,如avg(..)、count(...)等 */ protected void printFunction(StringBuffer buffer, AST ast) { buffer.append(ast.getText()); buffer.append("("); printChildren(buffer, ast, " "); buffer.append(")"); } /* * . */ protected void printDOT(StringBuffer buffer, AST ast) { AST left = ast.getFirstChild(); print(buffer, left); buffer.append(ast.getText()); AST right = left.getNextSibling(); print(buffer, right); } /* * 打印所有子节点 * @param buffer 结果输出为止 * @param ast AST树 * @param join 子节点间连接符 */ protected void printChildren(StringBuffer buffer, AST ast, String join) { AST child = ast.getFirstChild(); while (child != null) { print(buffer, child); child = child.getNextSibling(); if (child != null) { buffer.append(join); } } } /* * 打印自身,然后再打印子节点 * @param buffer * @param ast * @param join * @param selfJoin */ protected void printSelfAndChildren(StringBuffer buffer, AST ast, String join) { buffer.append(ast.getText()); buffer.append(" "); printChildren(buffer, ast, join); } /* * join */ protected void printJOIN(StringBuffer buffer, AST ast) { int length = buffer.length(); printChildren(buffer, ast, " "); if (!buffer.substring(length, buffer.length()).contains(ast.getText())) { buffer.insert(length, "join "); } } protected void printSELECT_FROM(StringBuffer buffer, AST ast) { AST from = ast.getFirstChild(); AST select = from.getNextSibling(); if (select != null) { print(buffer, select); buffer.append(" "); } print(buffer, from); } protected void printBETWEEN(StringBuffer buffer, AST ast) { int length = buffer.length(); AST property = ast.getFirstChild(); AST first = property.getNextSibling(); AST second = first.getNextSibling(); try { print(buffer, property); buffer.append(" "); printText(buffer, ast); buffer.append(" "); print(buffer, first); buffer.append(" and "); print(buffer, second); } catch (ValueNotExistException e) { if (buffer.lastIndexOf(":") > length) { this.parameters.remove(this.parameters.size() - 1); } //将已输出的部分截断 buffer.setLength(length); } } /* * 双操作数条件式,譬如like、=、in等等 */ protected void printCondition(StringBuffer buffer, AST ast) { int length = buffer.length(); AST left = ast.getFirstChild(); print(buffer, left); buffer.append(" "); buffer.append(ast.getText()); buffer.append(" "); AST right = left.getNextSibling(); try { print(buffer, right); } catch (ValueNotExistException e) { //将已输出的部分截断 buffer.setLength(length); } } }
发表评论
-
面向海量服务的设计原则和策略总结
2010-05-27 07:05 12771互联网服务的特点就是面向海量级的用户,面向海量级的 ... -
SpringMVC源码解析(下)
2009-05-22 12:11 52004.请求-处理链映射(HandlerMapping) ... -
SpringMVC源码解析(上)
2009-05-22 10:03 47121.从DispatcherServlet开始 ... -
JSP2.1规范
2009-05-19 16:15 2291JSP2.1规范 -
Servlet2.3规范
2009-05-19 15:49 1401Servlet2.3规范 -
半年TeamLeader总结
2008-10-18 09:29 1960成为一个小团队的TeamLe ... -
两年前看到的帖子--10年跳槽总结出的珍贵经验
2008-06-27 09:12 2337首先,真正的高级人才 ... -
读书笔记——关于Annotation与XML配置
2008-06-19 22:06 1705随着Java5的流行,Annotation渐有取代 ... -
读书笔记——Spring扩展点
2008-06-19 21:51 3956Ø BeanPostProcessors :该扩 ... -
读书笔记——事务总结
2008-06-16 22:41 17661. 事务四要素( ACID ) Ø Atom ... -
最近学习计划-共勉
2008-06-16 22:40 15701.spring设计艺术 1)spring源码重读 ... -
FreeMarker对Template的加载过程
2007-03-10 09:55 5125前一阵子在研究使用数据库来配置表现层的信息的技 ... -
在FreeMarker3.8-版本中实现FreeMarker3.8+的!功能
2007-03-10 09:30 3470FreeMarker3.8中引入了一个非常实用的 ...
相关推荐
weblogic12 下最新 org.hibernate.hql.ast.HqlToken解决办法
在使用TypeScript + AngularJS进行2015年6月举行的。 您可以按“ s”查看演讲者备忘,只有幻灯片时,按照演示文稿进行操作会更容易。 按“ f”键全屏显示,效果更好。 如果您有任何疑问/建议/更正,请与我联系!...
ast解混淆工具的第三版,前两版在我的github上,第三版优化内容在使用了多线程,但是处理过大的js时还是会有卡住的情况,在第二版的基础上优化了一下ast代码,添加了部分常用工具 v0.3目前未解决: 应用内说明文档...
AST2050显卡驱动,含Linux与Windows两个版本
Aspeed ast2500 datasheet v16版,pdf中有水印,带书签
AST2600 Datasheet
压缩包内为ast2500开发手册文档,主要介绍MDS工具的使用,方便用户进行ast2500应用开发。
BMC controller ast2400 datasheet V13. Engineer related to server design need follow this.
AST2400 iBMC 配置手册!分享一下,可以学习参考!!
Eclipse JDT插件中的AST库,可以用于构建java程序的抽象语法树
AST2400(BMC)技术文档
AST2500芯片配套的iBMC配置使用手册,详细地介绍了通过iBMC的浏览器页面管理功能管理服务器上FRU设备和服务器的运行管理和状态监控,是难得的熟悉AST2500带外管理工作方式的使用说明手册,值得下载学习。
AST 经典教程 适合新手学习的基础教程
NULL 博文链接:https://zhangzhi199129.iteye.com/blog/1626311
eclipse cdt 解析C++ AST
如何通过ASTNode修改Java源码:遍历项目解析为ASTnode节点,修改ASTNode节点,利用ASTNode节点创建新的Java 资源目标代码,删除原有的拟修改代码。
Aspeed ast2500 datasheet v16版,已经去除pdf中的水印,带书签
ASTq 是一个用于 JavaScript 的抽象语法树 (AST) 查询引擎库,也就是说,它允许您在强大的 XPath 启发式查询语言的帮助下查询任意 AST 样式分层数据结构的节点。 ASTq 可以在可插拔访问适配器的帮助下对任意 AST ...
AST4100压力传感器的性能及参数介绍
AST2500是ASPEED公司生产的BMC芯片,用于服务器的远程管理,一般还兼用作服务器的显示芯片,输出VGA信号,显示功能很基础,但对于服务器而言足够了。