svn commit: r835637 - in /ofbiz/trunk/framework/entity: build.xml src/org/ofbiz/entity/sql/ src/org/ofbiz/entity/sql/Parser.jjt src/org/ofbiz/entity/sql/SQLSelect.java

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r835637 - in /ofbiz/trunk/framework/entity: build.xml src/org/ofbiz/entity/sql/ src/org/ofbiz/entity/sql/Parser.jjt src/org/ofbiz/entity/sql/SQLSelect.java

doogie-3
Author: doogie
Date: Thu Nov 12 23:23:12 2009
New Revision: 835637

URL: http://svn.apache.org/viewvc?rev=835637&view=rev
Log:
Start of new sql parsing code.  Not completely tested.  It *does* parse
a test SELECT; what is not tested is actually running the built
DynamicViewEntity.

Added:
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/Parser.jjt
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/SQLSelect.java
Modified:
    ofbiz/trunk/framework/entity/build.xml

Modified: ofbiz/trunk/framework/entity/build.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/build.xml?rev=835637&r1=835636&r2=835637&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/build.xml (original)
+++ ofbiz/trunk/framework/entity/build.xml Thu Nov 12 23:23:12 2009
@@ -38,6 +38,10 @@
         <fileset dir="../base/lib/scripting" includes="*.jar"/>
         <fileset dir="../base/build/lib" includes="*.jar"/>
     </path>
+    <path id="src-path">
+        <pathelement location="build/gen-src/javacc"/>
+        <pathelement location="build/gen-src/jjtree"/>
+    </path>
 
     <patternset id="src.exc.set">
         <exclude name="org/ofbiz/entity/connection/XaPoolConnectionFactory.java"/>
@@ -48,7 +52,11 @@
     <!-- Compilation of the source files                                                                                                                         -->
     <!-- ================================================================== -->
 
-    <target name="classes" depends="prepare">
+    <target name="gen-src">
+        <ofbiz-jjtree dir="org/ofbiz/entity/sql" file="Parser"/>
+    </target>
+
+    <target name="classes" depends="prepare,gen-src">
         <javac15/>
     </target>
 

Added: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/Parser.jjt
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/Parser.jjt?rev=835637&view=auto
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/Parser.jjt (added)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/Parser.jjt Thu Nov 12 23:23:12 2009
@@ -0,0 +1,414 @@
+options {
+  JAVA_UNICODE_ESCAPE = false;
+  ERROR_REPORTING = true;
+  STATIC = false;
+  MULTI = true;
+  JDK_VERSION = "1.5";
+  VISITOR = true;
+  BUILD_NODE_FILES = true;
+  NODE_FACTORY = false;
+  NODE_USES_PARSER = true;
+//  NODE_SCOPE_HOOK = true;
+  NODE_PREFIX = "SQL";
+//  DEBUG_PARSER = true;
+//  DEBUG_LOOKAHEAD = true;
+//  DEBUG_TOKEN_MANAGER = true;
+  LOOKAHEAD = 1;
+//  CHOICE_AMBIGUITY_CHECK = 3;
+//  OTHER_AMBIGUITY_CHECK = 3;
+  IGNORE_CASE = true;
+}
+PARSER_BEGIN(Parser)
+
+package org.ofbiz.entity.sql;
+
+import java.io.*;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Set;
+
+import javolution.util.FastList;
+import javolution.util.FastSet;
+
+import org.ofbiz.base.conversion.ConversionException;
+import org.ofbiz.base.conversion.Converter;
+import org.ofbiz.base.conversion.Converters;
+import org.ofbiz.entity.condition.EntityComparisonOperator;
+import org.ofbiz.entity.condition.EntityCondition;
+import org.ofbiz.entity.condition.EntityConditionValue;
+import org.ofbiz.entity.condition.EntityFieldValue;
+import org.ofbiz.entity.condition.EntityOperator;
+import org.ofbiz.entity.model.DynamicViewEntity;
+import org.ofbiz.entity.model.ModelKeyMap;
+
+public class Parser {
+}
+
+PARSER_END(Parser)
+TOKEN_MGR_DECLS: {
+ private final LinkedList<Integer> stack = new LinkedList<Integer>();
+
+ void pushState(int newState) {
+ stack.add(curLexState);
+ SwitchTo(newState);
+ }
+
+ void popState() {
+ SwitchTo(stack.removeLast());
+ }
+}
+
+TOKEN: {
+ <OPEN_PAREN: "(">
+| <CLOSE_PAREN: ")">
+| <AND: "AND">
+| <OR: "OR">
+| <PERIOD: ".">
+| <JOIN: "JOIN">
+| <LEFT: "LEFT">
+| <RIGHT: "RIGHT">
+| <AS: "AS">
+| <WHERE: "WHERE">
+| <HAVING: "HAVING">
+| <GROUP: "GROUP">
+| <ORDER: "ORDER">
+| <UNION: "UNION">
+| <BY: "BY">
+| <ON: "ON">
+| <LIMIT: "LIMIT">
+| <OFFSET: "OFFSET">
+| <SELECT: "SELECT">
+| <DELETE: "DELETE">
+| <UPDATE: "UPDATE">
+| <SET: "SET">
+| <FROM: "FROM">
+| <SEMI: ";">
+| <STAR: "*">
+| <COMMA: ",">
+| <START_DQUOTE: "\""> { pushState(IN_DQUOTE); }
+| <START_SQUOTE: "'"> { pushState(IN_SQUOTE); }
+| <INTEGER:
+ "0" (
+ "x" (["0"-"9","a"-"b"])+
+ | (["0"-"7"])+
+ )
+ | ["1"-"9"] (["0"-"9"])*
+ >
+| <NAME: (["a"-"z"])+>
+//| <WORD: (~["'", "\"", "/", " ", "\f", "\n", "\r", "\t", "*"])+>
+}
+
+<DEFAULT>
+SKIP: {
+ <SPACE: " " | "\f" | "\n" | "\r" | "\t">
+}
+
+<*>
+MORE: {
+ <COMMENT_START: "/*"> { if (curLexState != IN_COMMENT) pushState(IN_COMMENT); }
+}
+
+<IN_COMMENT>
+MORE: {
+ <(~[])>
+| <COMMENT_END: ("\n" | "\r" | "\r\n")> { popState(); }
+}
+
+<IN_DQUOTE,IN_SQUOTE>
+TOKEN: {
+ <ESCAPED: "\\" ["r", "n", "b", "t", "f"]>
+}
+
+<IN_DQUOTE>
+TOKEN: {
+ <END_DQUOTE: "\""> { popState(); }
+}
+
+<IN_SQUOTE>
+TOKEN: {
+ <ESCAPE_SQUOTE: "''">
+| <END_SQUOTE: "'"> { popState(); }
+}
+
+<DEFAULT,IN_DQUOTE,IN_SQUOTE>
+TOKEN: {
+ <TEXT: (~[])>
+}
+
+// -------------------
+
+
+SQLSelect Select():
+{
+ EntityCondition condition;
+ int i;
+ DynamicViewEntity dve = new DynamicViewEntity();
+}
+{
+ <SELECT> FieldDefs(dve)
+ <FROM> Table(dve)
+ ( <WHERE> condition=ConditionExpression() { jjtThis.setWhereCondition(condition); } )?
+ ( <HAVING> condition=ConditionExpression() { jjtThis.setHavingCondition(condition); } )?
+ ( <GROUP> <BY> FieldList() )?
+ ( <ORDER> <BY> FieldList() )?
+ ( <OFFSET> i=Integer() { jjtThis.setOffset(i); } )?
+ ( <LIMIT> i=Integer() { jjtThis.setLimit(i); } )?
+ <SEMI>
+ { return jjtThis; }
+}
+/*
+CSSUpdate Update():
+{}
+{
+ <UPDATE> Table()
+ ( Set() )+
+ ( <FROM> TableList() )?
+ ( <WHERE> ConditionExpression() )?
+ <SEMI>
+}
+
+CSSDelete Delete():
+{}
+{
+ <DELETE> <FROM> Table()
+ ( <USING> TableList() )?
+ ( <WHERE> ConditionExpression() )?
+ <SEMI>
+}
+*/
+
+private void Table(DynamicViewEntity dve) #void:
+{
+ String leftAlias, rightAlias;
+ Boolean relOptional;
+ Set<String> availableAliases = FastSet.newInstance();
+ List<ModelKeyMap> keyMaps;
+}
+{
+ leftAlias=TableName(dve) { availableAliases.add(leftAlias); }
+ (
+ relOptional=Joiner() rightAlias=TableName(dve) { availableAliases.add(rightAlias); }
+ <ON> keyMaps=KeyMaps(leftAlias, rightAlias) {
+     dve.addViewLink(leftAlias, rightAlias, relOptional, keyMaps);
+ }
+
+ )*
+
+}
+
+private List<ModelKeyMap> KeyMaps(String leftAlias, String rightAlias) #void:
+{
+ List<ModelKeyMap> keyMaps = FastList.newInstance();
+ ModelKeyMap keyMap;
+}
+{
+ keyMap=KeyMap(leftAlias, rightAlias) { keyMaps.add(keyMap); }
+ ( <AND> keyMap=KeyMap(leftAlias, rightAlias) )* { keyMaps.add(keyMap); }
+ { return keyMaps; }
+}
+
+private ModelKeyMap KeyMap(String leftAlias, String rightAlias) #void:
+{
+ String alias1, field1;
+ String alias2, field2;
+ EntityComparisonOperator op;
+}
+{
+ alias1=NamePart() <PERIOD> field1=NamePart()
+ op=ComparisonOperator()
+ alias2=NamePart() <PERIOD> field2=NamePart()
+ {
+ if (op != EntityOperator.EQUALS) throw new IllegalArgumentException(op + " not supported");
+ if (alias1.equals(leftAlias)) {
+ if (!alias2.equals(rightAlias)) throw new IllegalArgumentException("invalid right alias(" + alias2 + "), expected(" + rightAlias + ")");
+ return new ModelKeyMap(field1, field2);
+ } else if (alias1.equals(rightAlias)) {
+ if (!alias2.equals(leftAlias)) throw new IllegalArgumentException("invalid left alias(" + alias2 + "), expected(" + leftAlias + ")");
+ return new ModelKeyMap(field2, field1);
+ } else {
+ throw new IllegalArgumentException("invalid aliases, expected(" + leftAlias + " or " + rightAlias + ")");
+ }
+ }
+}
+
+private String TableName(DynamicViewEntity dve) #void:
+{
+ String name, alias = null;
+}
+{
+ name=NamePart() ( (<AS>)? alias=NamePart() )?
+ {
+ if (alias == null) alias = name;
+ dve.addMemberEntity(alias, name);
+ return alias;
+ }
+}
+
+private Boolean Joiner() #void:
+{}
+{
+ <LEFT> <JOIN> { return Boolean.TRUE; }
+| <JOIN> { return Boolean.FALSE; }
+}
+private void FieldDefs(DynamicViewEntity dve) #void:
+{}
+{
+ FieldDef(dve) ( <COMMA> FieldDef(dve) )*
+}
+
+private void FieldDef(DynamicViewEntity dve) #void:
+{}
+{
+ LOOKAHEAD(AllField()) AllField(dve)
+| FieldSpec(dve)
+}
+
+private void AllField(DynamicViewEntity dve) #void:
+{
+ String n;
+}
+{
+ n=NamePart() <PERIOD>
+ <STAR>
+ { dve.addAliasAll(n, null); }
+}
+
+private String NamePart() #void:
+{}
+{
+ ( LOOKAHEAD(2) <NAME>)+ { return getToken(0).image; }
+}
+
+private void FieldSpec(DynamicViewEntity dve) #void:
+{
+ List<String> fieldUse;
+ String tableAlias, fieldName, fieldAlias = null;
+}
+{
+ tableAlias=NamePart() <PERIOD> fieldName=NamePart()
+ ( <AS> fieldAlias=NamePart() )?
+ {
+ if (fieldAlias == null) {
+ dve.addAlias(tableAlias, fieldName);
+ } else {
+ dve.addAlias(tableAlias, fieldAlias, fieldName, null, null, null, null);
+ }
+ }
+}
+
+private String DQuoted() #void:
+{ StringBuilder sb = new StringBuilder(); }
+{
+ <START_DQUOTE> (<TEXT> { sb.append(getToken(0).image); } | <ESCAPED> { sb.append(getToken(0).image); })* <END_DQUOTE>
+ { return sb.toString(); }
+}
+
+private String SQuoted() #void:
+{ StringBuilder sb = new StringBuilder(); }
+{
+ <START_SQUOTE> (
+ <TEXT> { sb.append(getToken(0).image); }
+ | <ESCAPED> { sb.append(getToken(0).image); }
+ | <ESCAPE_SQUOTE> { sb.append("'"); }
+ )* <END_SQUOTE>
+ { return sb.toString(); }
+}
+
+private void FieldList():
+{}
+{
+ FieldUse() ( <COMMA> FieldUse() )*
+}
+
+private List<String> FieldUse() #void:
+{
+ List<String> list = FastList.newInstance();
+ String s;
+}
+{
+ s=NamePart() { list.add(s); }
+ ( <PERIOD> s=NamePart() { list.add(s); } )?
+ { return list; }
+}
+
+private Integer Integer() #void:
+{}
+{
+ <INTEGER> {
+ try {
+ Converter<String, Integer> converter = Converters.getConverter(String.class, Integer.class);
+ return converter.convert(getToken(0).image);
+ } catch (ClassNotFoundException e) {
+ return null;
+ } catch (ConversionException e) {
+ return null;
+ }
+ }
+}
+
+private Object Expression() #void:
+{
+ EntityConditionValue ecv;
+ String s;
+ List<String> fieldUse;
+ int i;
+}
+{
+ fieldUse=FieldUse() {
+ if (fieldUse.size() == 1) return EntityFieldValue.makeFieldValue(fieldUse.get(0));
+ if (fieldUse.size() == 2) return EntityFieldValue.makeFieldValue(fieldUse.get(1), fieldUse.get(1), null, null);
+ return null;
+}
+| i=Integer() { return i; }
+| s=SQuoted() { return s; }
+}
+
+private EntityCondition ConditionExpression() #void:
+{ EntityCondition ec; }
+{
+ ec=AndExpression() { return ec; }
+}
+
+private EntityCondition AndExpression() #void:
+{
+ List<EntityCondition> list = FastList.newInstance();
+ EntityCondition ec;
+}
+{
+ ec=OrExpression() { list.add(ec); }
+        ( <AND> ec=OrExpression() { list.add(ec); } )*
+ {
+ if (list.size() == 1) return list.get(0);
+ return EntityCondition.makeCondition(list, EntityOperator.AND);
+ }
+}
+
+private EntityCondition OrExpression() #void:
+{
+ List<EntityCondition> list = FastList.newInstance();
+ EntityCondition ec;
+}
+{
+ ec=BooleanExpression() { list.add(ec); }
+        ( <OR> ec=BooleanExpression() { list.add(ec); } )*
+ {
+ if (list.size() == 1) return list.get(0);
+ return EntityCondition.makeCondition(list, EntityOperator.OR);
+ }
+}
+
+private EntityCondition BooleanExpression() #void:
+{
+ Object v1, v2;
+ EntityComparisonOperator op;
+}
+{
+ v1=Expression() op=ComparisonOperator() v2=Expression()
+ { return EntityCondition.makeCondition(v1, op, v2); }
+}
+
+private EntityComparisonOperator ComparisonOperator() #void:
+{}
+{
+ ( <TEXT> )+ { return EntityOperator.lookupComparison(getToken(0).image); }
+}

Added: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/SQLSelect.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/SQLSelect.java?rev=835637&view=auto
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/SQLSelect.java (added)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/sql/SQLSelect.java Thu Nov 12 23:23:12 2009
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.ofbiz.entity.sql;
+
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.GenericEntityException;
+import org.ofbiz.entity.condition.EntityCondition;
+import org.ofbiz.entity.model.DynamicViewEntity;
+import org.ofbiz.entity.util.EntityListIterator;
+
+public class SQLSelect extends SimpleNode {
+    private DynamicViewEntity dve;
+    private EntityCondition whereCondition;
+    private EntityCondition havingCondition;
+    private int offset = -1;
+    private int limit = -1;
+
+    public SQLSelect(int id) {
+        super(id);
+    }
+
+    public SQLSelect(Parser p, int id) {
+        super(p, id);
+    }
+
+
+    /** Accept the visitor. **/
+    public Object jjtAccept(ParserVisitor visitor, Object data) {
+        return visitor.visit(this, data);
+    }
+
+    public EntityListIterator getEntityListIterator(Delegator delegator) throws GenericEntityException {
+        return delegator.findListIteratorByCondition(dve, whereCondition, havingCondition, null, null, null);
+    }
+
+    void setDynamicViewEntity(DynamicViewEntity dve) {
+        this.dve = dve;
+    }
+
+    public DynamicViewEntity getDynamicViewEntity() {
+        return dve;
+    }
+
+    void setWhereCondition(EntityCondition whereCondition) {
+        this.whereCondition = whereCondition;
+    }
+
+    public EntityCondition getWhereCondition() {
+        return whereCondition;
+    }
+
+    void setHavingCondition(EntityCondition havingCondition) {
+        this.havingCondition = havingCondition;
+    }
+
+    public EntityCondition getHavingCondition() {
+        return havingCondition;
+    }
+
+    void setOffset(int offset) {
+        this.offset = offset;
+    }
+
+    public int getOffset() {
+        return offset;
+    }
+
+    void setLimit(int limit) {
+        this.limit = limit;
+    }
+
+    public int getLimit() {
+        return limit;
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("dve=" + dve);
+        if (whereCondition != null) {
+            if (sb.length() > 0) sb.append(", ");
+            sb.append("where=(").append(whereCondition).append(")");
+        }
+        if (havingCondition != null) {
+            if (sb.length() > 0) sb.append(", ");
+            sb.append("having=(").append(havingCondition).append(")");
+        }
+        if (offset != -1) {
+            if (sb.length() > 0) sb.append(", ");
+            sb.append("offset=").append(offset);
+        }
+        if (limit != -1) {
+            if (sb.length() > 0) sb.append(", ");
+            sb.append("limit=").append(limit);
+        }
+        sb.append("]");
+        sb.insert(0, "[").insert(0, super.toString());
+        return sb.toString();
+    }
+}
+/* JavaCC - OriginalChecksum=49309c1a721b16d029f160d2568a03bc (do not edit this line) */