[hibernate-commits] Hibernate SVN: r16385 - in core/branches/antlr3/src: main/java/org/hibernate/sql/ast/common and 3 other directories.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Tue Apr 21 13:33:52 EDT 2009
Author: porcelli
Date: 2009-04-21 13:33:51 -0400 (Tue, 21 Apr 2009)
New Revision: 16385
Modified:
core/branches/antlr3/src/main/antlr3/org/hibernate/sql/ast/phase/hql/parse/HQL.g
core/branches/antlr3/src/main/antlr3/org/hibernate/sql/ast/phase/hql/parse/HQLTreeWalker.g
core/branches/antlr3/src/main/java/org/hibernate/sql/ast/common/HibernateTree.java
core/branches/antlr3/src/main/java/org/hibernate/sql/ast/phase/hql/parse/ParserContext.java
core/branches/antlr3/src/main/java/org/hibernate/sql/ast/phase/hql/parse/ParserContextDefaultImpl.java
core/branches/antlr3/src/main/java/org/hibernate/sql/ast/tree/EntityNameTree.java
core/branches/antlr3/src/test/gunit/org/hibernate/sql/ast/phase/hql/parse/TempgUnitHQLGrammar.testsuite
Log:
hql parser updates:
- now generating aliases for all persisterSpaces
- now generating the select clause (implicit)
- .indices and .elements are not supported (forces users use function)
Modified: core/branches/antlr3/src/main/antlr3/org/hibernate/sql/ast/phase/hql/parse/HQL.g
===================================================================
--- core/branches/antlr3/src/main/antlr3/org/hibernate/sql/ast/phase/hql/parse/HQL.g 2009-04-21 15:40:24 UTC (rev 16384)
+++ core/branches/antlr3/src/main/antlr3/org/hibernate/sql/ast/phase/hql/parse/HQL.g 2009-04-21 17:33:51 UTC (rev 16385)
@@ -8,6 +8,7 @@
//GENERIC SQL TOKENS
TABLE;
COLUMN;
+ COLUMN_LIST;
//VIRTUAL TOKENS
ALIAS_NAME;
@@ -189,6 +190,7 @@
import java.util.HashSet;
import java.util.Set;
import java.util.Iterator;
+import org.hibernate.sql.ast.tree.EntityNameTree;
}
@lexer::header {
@@ -349,7 +351,7 @@
return implementors;
}
- private Object generatePersisterSpacesTree(List persistenceSpaces) {
+ private Tree generatePersisterSpacesTree(List persistenceSpaces) {
List persisterSpaceList = new ArrayList();
for (Iterator iterator = persistenceSpaces.iterator(); iterator
.hasNext();) {
@@ -372,54 +374,77 @@
return resultTree;
}
-
- private Object generateUpdateStatementTree(Object updateKey, Object entityName,
- Object aliasClause, Object setClause, Object whereClause) {
- Object result = (Object)adaptor.nil();
- EntityNameTree entityNameTree = (EntityNameTree) entityName;
- for (int i = 0; i < entityNameTree.getEntityCount(); i++) {
- Object root_1 = (Object)adaptor.nil();
- root_1 = (Object)adaptor.becomeRoot(new CommonTree((CommonTree)updateKey), root_1);
- adaptor.addChild(root_1, new EntityNameTree(entityNameTree, entityNameTree.getEntityName(i)));
+ private Tree generateUpdateStatementTree(Object updateKey,
+ Object entityName, Object aliasClause, Object setClause,
+ Object whereClause) {
+ Tree result = new CommonTree();
+ EntityNameTree entityNameTree = (EntityNameTree) entityName;
+ for (int i = 0; i < entityNameTree.getEntityCount(); i++) {
+ Tree updateRoot = new CommonTree((CommonTree) updateKey);
- if ( aliasClause != null ) {
- adaptor.addChild(root_1, aliasClause);
- }
- adaptor.addChild(root_1, setClause);
+ updateRoot.addChild(new EntityNameTree(entityNameTree,
+ entityNameTree.getEntityName(i)));
- if ( whereClause != null ) {
- adaptor.addChild(root_1, whereClause);
- }
+ if (aliasClause != null) {
+ updateRoot.addChild((Tree) aliasClause);
+ }
+ updateRoot.addChild((Tree) setClause);
- adaptor.addChild(result, root_1);
+ if (whereClause != null) {
+ updateRoot.addChild((Tree) whereClause);
+ }
+
+ result.addChild(updateRoot);
}
return result;
}
-
- private Object generateDeleteStatementTree(Object deleteKey, Object entityName,
- Object aliasClause, Object whereClause) {
- Object result = (Object)adaptor.nil();
- EntityNameTree entityNameTree = (EntityNameTree) entityName;
- for (int i = 0; i < entityNameTree.getEntityCount(); i++) {
- Object root_1 = (Object)adaptor.nil();
- root_1 = (Object)adaptor.becomeRoot(new CommonTree((CommonTree)deleteKey), root_1);
- adaptor.addChild(root_1, new EntityNameTree(entityNameTree, entityNameTree.getEntityName(i)));
+ private Tree generateDeleteStatementTree(Object deleteKey,
+ Object entityName, Object aliasClause, Object whereClause) {
+ Tree result = new CommonTree();
+ EntityNameTree entityNameTree = (EntityNameTree) entityName;
+ for (int i = 0; i < entityNameTree.getEntityCount(); i++) {
+ Tree deleteRoot = new CommonTree((CommonTree) deleteKey);
- if ( aliasClause != null ) {
- adaptor.addChild(root_1, aliasClause);
- }
+ deleteRoot.addChild(new EntityNameTree(entityNameTree,
+ entityNameTree.getEntityName(i)));
- if ( whereClause != null ) {
- adaptor.addChild(root_1, whereClause);
- }
+ if (aliasClause != null) {
+ deleteRoot.addChild((Tree) aliasClause);
+ }
- adaptor.addChild(result, root_1);
+ if (whereClause != null) {
+ deleteRoot.addChild((Tree) whereClause);
+ }
+
+ result.addChild(deleteRoot);
}
return result;
}
+ private Tree generateSelecFromTree(Object selectClause, Object fromClause, List aliasList){
+ Tree result = new CommonTree(new CommonToken(SELECT_FROM, "SELECT_FROM"));
+ Tree selectTree = null;
+ result.addChild((Tree) fromClause);
+ if (selectClause == null && aliasList != null && aliasList.size() > 0) {
+ selectTree = new CommonTree(new CommonToken(SELECT, "SELECT"));
+ Tree selectList = new CommonTree(new CommonToken(SELECT_LIST, "SELECT_LIST"));
+ for (Iterator iterator = aliasList.iterator(); iterator
+ .hasNext();) {
+ String aliasName = (String) iterator.next();
+ Tree selectElement = new CommonTree(new CommonToken(SELECT_ITEM, "SELECT_ITEM"));
+ Tree aliasElement = new CommonTree(new CommonToken(ALIAS_REF, aliasName));
+ selectElement.addChild(aliasElement);
+ selectList.addChild(selectElement);
+ }
+ selectTree.addChild(selectList);
+ } else {
+ selectTree = (Tree) selectClause;
+ }
+ result.addChild(selectTree);
+ return result;
+ }
}
filterStatement[String collectionRole]
@@ -446,7 +471,7 @@
}
: udpate_key
(versioned_key {$updateStatement::generateVersionedField = true;})?
- from_key? entityName aliasClause setClause whereClause?
+ from_key? entityName aliasClause[true] setClause whereClause?
-> { generateUpdateStatementTree($udpate_key.tree, $entityName.tree, $aliasClause.tree, $setClause.tree, $whereClause.tree ) }
;
@@ -465,7 +490,7 @@
;
deleteStatement
- : delete_key from_key? entityName aliasClause whereClause?
+ : delete_key from_key? entityName aliasClause[true] whereClause?
-> { generateDeleteStatementTree($delete_key.tree, $entityName.tree, $aliasClause.tree, $whereClause.tree ) }
;
@@ -476,7 +501,8 @@
//TODO: Generate an exception when try to use a polimorfic entity at INTO clause
intoClause
- : into_key^ entityName insertabilitySpecification
+ : into_key entityName insertabilitySpecification
+ -> ^(into_key entityName ALIAS_NAME[context.buildUniqueImplicitAlias()] insertabilitySpecification)
;
insertabilitySpecification
@@ -525,8 +551,8 @@
;
selectFrom
- : selectClause? fromClause
- -> ^(SELECT_FROM fromClause selectClause?)
+ : sc=selectClause? fc=fromClause
+ -> { generateSelecFromTree($sc.tree, $fc.tree, $fc.aliasList)}
;
subQuery
@@ -536,7 +562,12 @@
-> ^(SUB_QUERY ^(QUERY queryExpression))
;
-fromClause
+fromClause returns [List aliasList]
+scope{
+ List aliases;
+}
+ at init { $fromClause::aliases = new ArrayList(); }
+ at after { $aliasList = $fromClause::aliases; }
: from_key^
persisterSpaces
;
@@ -556,8 +587,9 @@
;
qualifiedJoin
- at init { boolean isEntityReference = false; List entityNames = null; }
- : nonCrossJoinType join_key fetch_key? path aliasClause
+ at init { boolean isEntityReference = false; boolean hasFetch = false; List entityNames = null; }
+ at after { if (!hasFetch) $fromClause::aliases.add(((Tree)$ac.tree).getText()); }
+ : nonCrossJoinType join_key (fetch_key {hasFetch = true;})? path ac=aliasClause[true]
( on_key
{ isEntityReference = true;
entityNames = extractEntityNames($path.text); }
@@ -593,7 +625,8 @@
;
mainEntityPersisterReference
- : entityName aliasClause propertyFetch?
+ at after { $fromClause::aliases.add(((Tree)$ac.tree).getText()); }
+ : entityName ac=aliasClause[true] propertyFetch?
-> ^(ENTITY_PERSISTER_REF entityName aliasClause? propertyFetch?)
;
@@ -604,14 +637,16 @@
hibernateLegacySyntax returns [boolean isPropertyJoin]
@init {$isPropertyJoin = false;}
- : aliasDeclaration in_key
+ at after { $fromClause::aliases.add(((Tree)$ad.tree).getText()); }
+ : ad=aliasDeclaration in_key
( class_key entityName -> ^(ENTITY_PERSISTER_REF entityName aliasDeclaration)
| collectionExpression {$isPropertyJoin = true;} -> ^(PROPERTY_JOIN INNER[$in_key.start, "inner legacy"] aliasDeclaration collectionExpression)
)
;
jpaCollectionReference
- : in_key LEFT_PAREN propertyReference RIGHT_PAREN aliasClause
+ at after { $fromClause::aliases.add(((Tree)$ac.tree).getText()); }
+ : in_key LEFT_PAREN propertyReference RIGHT_PAREN ac=aliasClause[true]
-> ^(PROPERTY_JOIN INNER[$in_key.start, "inner"] aliasClause? propertyReference)
;
@@ -638,14 +673,15 @@
@init { if (state.backtracking == 0) enableParameterUsage.push(Boolean.FALSE); }
@after { enableParameterUsage.pop(); }
//PARAMETERS CAN'T BE USED -> This verification should be scoped
- : expression aliasClause
+ : expression aliasClause[false]
-> ^(SELECT_ITEM expression aliasClause?)
;
-aliasClause
+aliasClause[boolean generateAlias]
options{
k=2;
-} :
+} : -> {$generateAlias}? ALIAS_NAME[context.buildUniqueImplicitAlias()]
+ ->
| aliasDeclaration
| as_key! aliasDeclaration
;
@@ -807,7 +843,7 @@
| standardFunction
| setFunction
| collectionFunction
- | collectionExpressionSimple
+ | collectionExpression
| atom
;
@@ -854,8 +890,8 @@
quantifiedExpression
: ( some_key^ | exists_key^ | all_key^ | any_key^ )
- ( aliasReference
- | collectionExpression
+ ( collectionExpression
+ | aliasReference
| LEFT_PAREN! subQuery RIGHT_PAREN!
)
;
@@ -1024,14 +1060,8 @@
countFunctionArguments
@init { int type = -1;}
- : path
- -> {type == 1}? ^(ELEMENTS ^(PROPERTY_REFERENCE path))
- -> {type == 2}? ^(INDICES ^(PROPERTY_REFERENCE path))
- -> ^(PROPERTY_REFERENCE path)
- //TODO if ends with:
- // .elements or .indices -> it is a collectionExpression
- //if not -> it is a property reference
- | collectionExpressionSimple
+ : propertyReference
+ | collectionExpression
| numeric_literal
;
@@ -1043,25 +1073,17 @@
collectionExpression
: (elements_key^|indices_key^) LEFT_PAREN! propertyReference RIGHT_PAREN!
- | propertyReference DOT! (elements_key^|indices_key^)
;
-collectionExpressionSimple
- : (elements_key^|indices_key^) LEFT_PAREN! propertyReference RIGHT_PAREN!
- ;
-
atom
@init { int type = -1;}
: identPrimary
//TODO if ends with:
// .class -> class type
- // .elements or .indices -> it is a collectionExpression
// if contains "()" it is a function call
// if it is constantReference (using context)
// otherwise it will be a generic element to be resolved on the next phase (1st tree walker)
-> {type == 0}? ^(DOT_CLASS identPrimary)
- -> {type == 1}? ^(ELEMENTS ^(PROPERTY_REFERENCE identPrimary))
- -> {type == 2}? ^(INDICES ^(PROPERTY_REFERENCE identPrimary))
-> {type == 3}? ^(GENERAL_FUNCTION_CALL identPrimary)
-> {type == 4}? ^(JAVA_CONSTANT identPrimary) //-> here will have 2 strutctures element and the constant
-> ^(PATH identPrimary)
@@ -1826,4 +1848,4 @@
AMPERSAND
: '&'
- ;
\ No newline at end of file
+ ;
Modified: core/branches/antlr3/src/main/antlr3/org/hibernate/sql/ast/phase/hql/parse/HQLTreeWalker.g
===================================================================
--- core/branches/antlr3/src/main/antlr3/org/hibernate/sql/ast/phase/hql/parse/HQLTreeWalker.g 2009-04-21 15:40:24 UTC (rev 16384)
+++ core/branches/antlr3/src/main/antlr3/org/hibernate/sql/ast/phase/hql/parse/HQLTreeWalker.g 2009-04-21 17:33:51 UTC (rev 16385)
@@ -138,8 +138,12 @@
: persisterSpaceRoot joins*
;
+persisterSpaceRoot
+ : ^(ENTITY_PERSISTER_REF entityName PROP_FETCH?)
+ ;
+
joins
- : ^(PROPERTY_JOIN joinType FETCH? ALIAS_NAME? PROP_FETCH? (propertyReference|collectionExpression) withClause?)
+ : ^(PROPERTY_JOIN joinType FETCH? ALIAS_NAME PROP_FETCH? collectionExpression withClause?)
| ^(PERSISTER_JOIN joinType persisterSpaceRoot onClause?)
;
@@ -157,10 +161,6 @@
| (LEFT | RIGHT | FULL) OUTER?
;
-persisterSpaceRoot
- : ^(ENTITY_PERSISTER_REF entityName PROP_FETCH?)
- ;
-
selectClause
: ^(SELECT DISTINCT? rootSelectExpression)
;
@@ -258,7 +258,7 @@
: caseExpression
| function
| collectionFunction
- | collectionExpression
+ | collectionExpressionSimple
| constant
| parameter
| propertyReference
@@ -434,7 +434,7 @@
;
countFunctionArguments
- : collectionExpression
+ : collectionExpressionSimple
| propertyReference
| numeric_literal
;
@@ -448,9 +448,15 @@
: propertyReference
;
+collectionExpressionSimple
+ : ^(ELEMENTS propertyReference) //it will generate a SELECT m.column form Table xxx -> it is realted to Hibernate mappings to Table->Map
+ | ^(INDICES propertyReference)
+ ;
+
collectionExpression
: ^(ELEMENTS propertyReference) //it will generate a SELECT m.column form Table xxx -> it is realted to Hibernate mappings to Table->Map
| ^(INDICES propertyReference)
+ | propertyReference
;
parameter
@@ -481,7 +487,7 @@
;
entityName
- : ENTITY_NAME ALIAS_NAME?
+ : ENTITY_NAME ALIAS_NAME
;
propertyReference
Modified: core/branches/antlr3/src/main/java/org/hibernate/sql/ast/common/HibernateTree.java
===================================================================
--- core/branches/antlr3/src/main/java/org/hibernate/sql/ast/common/HibernateTree.java 2009-04-21 15:40:24 UTC (rev 16384)
+++ core/branches/antlr3/src/main/java/org/hibernate/sql/ast/common/HibernateTree.java 2009-04-21 17:33:51 UTC (rev 16385)
@@ -34,7 +34,7 @@
/**
* todo : javadocs
- *
+ *
* @author Steve Ebersole
*/
public class HibernateTree extends CommonTree {
@@ -48,30 +48,33 @@
*/
int endCharOffset = -1;
+ public HibernateTree() {
+ }
+
public HibernateTree(HibernateTree node) {
- super( node );
+ super(node);
this.token = node.token;
}
public HibernateTree(Token token) {
- super( token );
+ super(token);
}
public HibernateTree(int type, String text) {
- this( new HibernateToken( type, text ) );
+ this(new HibernateToken(type, text));
}
public HibernateTree(int type) {
- this( new HibernateToken( type ) );
+ this(new HibernateToken(type));
}
public Tree dupNode() {
- return new HibernateTree( this );
+ return new HibernateTree(this);
}
/**
* getter for start char offset
- *
+ *
* @return start char offset
*/
public int getStartCharOffset() {
@@ -80,8 +83,9 @@
/**
* setter for start char offset
- *
- * @param startCharOffset start char offset
+ *
+ * @param startCharOffset
+ * start char offset
*/
public void setStartCharOffset(int startCharOffset) {
this.startCharOffset = startCharOffset;
@@ -89,7 +93,7 @@
/**
* getter of end char offset
- *
+ *
* @return end char offset
*/
public int getEndCharOffset() {
@@ -98,8 +102,9 @@
/**
* setter of end char offset
- *
- * @param endCharOffset end char offset
+ *
+ * @param endCharOffset
+ * end char offset
*/
public void setEndCharOffset(int endCharOffset) {
this.endCharOffset = endCharOffset;
Modified: core/branches/antlr3/src/main/java/org/hibernate/sql/ast/phase/hql/parse/ParserContext.java
===================================================================
--- core/branches/antlr3/src/main/java/org/hibernate/sql/ast/phase/hql/parse/ParserContext.java 2009-04-21 15:40:24 UTC (rev 16384)
+++ core/branches/antlr3/src/main/java/org/hibernate/sql/ast/phase/hql/parse/ParserContext.java 2009-04-21 17:33:51 UTC (rev 16385)
@@ -9,4 +9,6 @@
public boolean isEntityName(String text);
public List getEntityImplementors(String text);
+
+ public String buildUniqueImplicitAlias();
}
Modified: core/branches/antlr3/src/main/java/org/hibernate/sql/ast/phase/hql/parse/ParserContextDefaultImpl.java
===================================================================
--- core/branches/antlr3/src/main/java/org/hibernate/sql/ast/phase/hql/parse/ParserContextDefaultImpl.java 2009-04-21 15:40:24 UTC (rev 16384)
+++ core/branches/antlr3/src/main/java/org/hibernate/sql/ast/phase/hql/parse/ParserContextDefaultImpl.java 2009-04-21 17:33:51 UTC (rev 16385)
@@ -3,8 +3,12 @@
import java.util.ArrayList;
import java.util.List;
+import org.hibernate.sql.ast.alias.ImplicitAliasGenerator;
+
public class ParserContextDefaultImpl implements ParserContext {
+ private ImplicitAliasGenerator implicitAliasGenerator = new ImplicitAliasGenerator();
+
public List getEntityImplementors(String text) {
List implementors = new ArrayList();
implementors.add(text);
@@ -19,4 +23,8 @@
return false;
}
+ public String buildUniqueImplicitAlias() {
+ return implicitAliasGenerator.buildUniqueImplicitAlias();
+ }
+
}
Modified: core/branches/antlr3/src/main/java/org/hibernate/sql/ast/tree/EntityNameTree.java
===================================================================
--- core/branches/antlr3/src/main/java/org/hibernate/sql/ast/tree/EntityNameTree.java 2009-04-21 15:40:24 UTC (rev 16384)
+++ core/branches/antlr3/src/main/java/org/hibernate/sql/ast/tree/EntityNameTree.java 2009-04-21 17:33:51 UTC (rev 16385)
@@ -4,20 +4,21 @@
import org.antlr.runtime.CommonToken;
import org.antlr.runtime.Token;
-import org.antlr.runtime.tree.CommonTree;
+import org.hibernate.sql.ast.common.HibernateTree;
-public class EntityNameTree extends CommonTree {
+public class EntityNameTree extends HibernateTree {
private List entityNames = null;
private String outputText = null;
public EntityNameTree(EntityNameTree entityNameTree, String outputText) {
- this.token = entityNameTree.getToken();
+ super(entityNameTree.getToken());
this.outputText = outputText;
}
public EntityNameTree(int tokenType, Token token, String tokenText,
List entityNames) {
+ super(token);
Token newToken = createToken(token);
newToken.setType(tokenType);
newToken.setText(tokenText);
@@ -28,7 +29,15 @@
private Token createToken(Token fromToken) {
return new CommonToken(fromToken);
}
-
+
+ public int getEntityCount() {
+ return entityNames.size();
+ }
+
+ public String getEntityName(int index) {
+ return (String) entityNames.get(index);
+ }
+
public String toString() {
if (outputText == null) {
outputText = entityNames.get(0).toString();
Modified: core/branches/antlr3/src/test/gunit/org/hibernate/sql/ast/phase/hql/parse/TempgUnitHQLGrammar.testsuite
===================================================================
--- core/branches/antlr3/src/test/gunit/org/hibernate/sql/ast/phase/hql/parse/TempgUnitHQLGrammar.testsuite 2009-04-21 15:40:24 UTC (rev 16384)
+++ core/branches/antlr3/src/test/gunit/org/hibernate/sql/ast/phase/hql/parse/TempgUnitHQLGrammar.testsuite 2009-04-21 17:33:51 UTC (rev 16385)
@@ -26,6 +26,9 @@
"from org.hibernate.test.Inner i where i.outer.inner.middle = 'xyz'" OK
//testDynamicInstantiation
"select new list(a, mate) from Animal a join a.mate as mate" OK
+"from Animal join a.mate" OK
+"from Animal, aaa , dddd" OK
+"from Animal, aaa join fetch dddd" OK
//testListOrMapKeywordReference
"select p from eg.NameList nl, eg.Person p where p.name = some elements(nl.names)" OK
"select p from eg.NameList list, eg.Person p where p.name = some elements(list.names)" OK
@@ -1526,7 +1529,7 @@
//ASTParserLoadingTest.testDynamicInstantiationQueries
"select new list(an.description, an.bodyWeight) from Animal an" OK
"select new map(an.description, an.bodyWeight) from Animal an" OK
-"select new map(an.description as descr, an.bodyWeight as bw) from Animal an" -> (AAA)
+"select new map(an.description as descr, an.bodyWeight as bw) from Animal an" OK
//ASTParserLoadingTest.testResultTransformerScalarQueries
"select an.description as description, an.bodyWeight as bodyWeight from Animal an order by bodyWeight desc" OK
"select a from Animal a, Animal b order by a.id" OK
More information about the hibernate-commits
mailing list