You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by do...@apache.org on 2009/11/14 02:15:56 UTC

svn commit: r836088 - /ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/Parser.jj

Author: doogie
Date: Sat Nov 14 01:15:56 2009
New Revision: 836088

URL: http://svn.apache.org/viewvc?rev=836088&view=rev
Log:
Support complex aliases now.  Note, that string default values do not
work corretly, and ModelViewEntity does not do any encoding of the
value, and this parser doesn't handle that.

Modified:
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/Parser.jj

Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/Parser.jj
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/Parser.jj?rev=836088&r1=836087&r2=836088&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/Parser.jj (original)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/Parser.jj Sat Nov 14 01:15:56 2009
@@ -42,6 +42,9 @@
 import org.ofbiz.entity.condition.OrderByList;
 import org.ofbiz.entity.model.DynamicViewEntity;
 import org.ofbiz.entity.model.ModelKeyMap;
+import org.ofbiz.entity.model.ModelViewEntity.ComplexAlias;
+import org.ofbiz.entity.model.ModelViewEntity.ComplexAliasField;
+import org.ofbiz.entity.model.ModelViewEntity.ComplexAliasMember;
 import org.ofbiz.entity.model.ModelViewEntity.ModelAlias;
 
 public class Parser {
@@ -85,6 +88,7 @@
 |	<DELETE: "DELETE">
 |	<UPDATE: "UPDATE">
 |	<RELATION: "RELATION">
+|	<COALESCE: "COALESCE">
 |	<TYPE: "TYPE">
 |	<TITLE: "TITLE">
 |	<SET: "SET">
@@ -305,9 +309,21 @@
 {
 	List<String> fieldUse;
 	String tableAlias, fieldName, fieldAlias = null, function;
+	ComplexAliasMember complexAlias;
 }
 {
-	function=AggregateFunction()
+	LOOKAHEAD(4) tableAlias=NamePart() <PERIOD>
+	(
+		<STAR> { dve.addAliasAll(tableAlias, null); }
+	|	fieldName=NamePart() ( <AS> fieldAlias=NamePart() )? {
+			if (fieldAlias == null) {
+				dve.addAlias(tableAlias, fieldName);
+			} else {
+				dve.addAlias(tableAlias, fieldAlias, fieldName, null, null, null, null);
+			}
+		}
+	)
+|	LOOKAHEAD(6) function=AggregateFunction()
 	<OPEN_PAREN>
 	tableAlias=NamePart() <PERIOD> fieldName=NamePart()
 	<CLOSE_PAREN>
@@ -318,17 +334,73 @@
 			dve.addAlias(tableAlias, fieldAlias, fieldName, null, null, null, function);
 		}
 	}
-|	tableAlias=NamePart() <PERIOD>
-	(
-		<STAR> { dve.addAliasAll(tableAlias, null); }
-	|	fieldName=NamePart() ( <AS> fieldAlias=NamePart() )? {
-			if (fieldAlias == null) {
-				dve.addAlias(tableAlias, fieldName);
-			} else {
-				dve.addAlias(tableAlias, fieldAlias, fieldName, null, null, null, null);
+|	complexAlias=ComplexAliasMember() <AS> fieldAlias=NamePart() {
+		dve.addAlias(null, fieldAlias, null, null, null, null, null, complexAlias);
+	}
+}
+
+private ComplexAliasMember ComplexAlias():
+{
+	List<ComplexAliasMember> list = FastList.newInstance();
+	ComplexAliasMember member;
+	String operator = null, newOperator;
+}
+{
+	<OPEN_PAREN>
+		member=ComplexAliasMember() { list.add(member); }
+		(
+			( <AND> | <OR> ) { newOperator = getToken(0).image.toLowerCase(); }
+			member=ComplexAliasMember() {
+				if (operator == null) {
+					operator = newOperator;
+				} else if (!newOperator.equals(operator)) {
+					throw new IllegalArgumentException("Different operators in complex alias(" + operator + ":" + newOperator + ")");
+				}
+				list.add(member);
 			}
-		}
-	)
+		)*
+	<CLOSE_PAREN>
+	{
+		if (list.size() == 1) return list.get(0);
+		ComplexAlias complexAlias = new ComplexAlias(operator);
+		complexAlias.addAllComplexAliasMembers(list);
+		return complexAlias;
+	}
+}
+
+private ComplexAliasMember ComplexAliasMember():
+{
+	ComplexAliasMember member;
+}
+{
+	member=ComplexAlias() { return member; }
+|	member=ComplexAliasField() { return member; }
+}
+
+private ComplexAliasMember ComplexAliasField():
+{
+	String function = null, tableName, fieldName;
+	Object dflt = null;
+}
+{
+	(
+		function=AggregateFunction() <OPEN_PAREN> (
+			<COALESCE> <OPEN_PAREN>
+				tableName=NamePart() <PERIOD> fieldName=NamePart()
+				<COMMA>
+				dflt=ConstantValue()
+			<CLOSE_PAREN>
+		|	tableName=NamePart() <PERIOD> fieldName=NamePart()
+		) <CLOSE_PAREN>
+	|	<COALESCE> <OPEN_PAREN>
+			tableName=NamePart() <PERIOD> fieldName=NamePart()
+			<COMMA>
+			dflt=ConstantValue()
+		<CLOSE_PAREN>
+	|	tableName=NamePart() <PERIOD> fieldName=NamePart()
+	) {
+		return new ComplexAliasField(tableName, fieldName, dflt != null ? dflt.toString() : null, function);
+	}
 }
 
 private String NamePart():
@@ -420,12 +492,20 @@
 private Object Expression():
 {
 	EntityConditionValue ecv;
+	Object v;
+}
+{
+	ecv=FieldUse() { return ecv; }
+|	v=ConstantValue() { return v; }
+}
+
+private Object ConstantValue():
+{
 	String s;
 	int i;
 }
 {
-	ecv=FieldUse() { return ecv; }
-|	i=Integer() { return i; }
+	i=Integer() { return i; }
 |	s=SQuoted() { return s; }
 }