froehlich    01/11/29 02:35:26

  Modified:    apps/db/src/java/org/apache/avalon/db/basic/actions
                        BasicUpdateRows.java BasicSelectSimple.java
                        BasicDeleteRows.java BasicCreateView.java
                        BasicCreateAggregateView.java
  Added:       apps/db/src/java/org/apache/avalon/db/basic/actions
                        BasicLXSQLCriteriaHelper.java
                        BasicCriteriaMatchingRowCallback.java
                        BasicCriteria.java
  Removed:     apps/db/src/java/org/apache/avalon/db/basic/actions
                        SimpleWhereClauseMatchingRowCallback.java
                        SimpleWhereClause.java
  Log:
  moved parsing logic from SimpleWhereClause and renamed it to
  BasicCriteria. Parsing logic now in BasicLXSQLCriteriaHelper.
  
  Revision  Changes    Path
  1.5       +6 -6      
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicUpdateRows.java
  
  Index: BasicUpdateRows.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicUpdateRows.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- BasicUpdateRows.java      2001/11/23 08:21:53     1.4
  +++ BasicUpdateRows.java      2001/11/29 10:35:26     1.5
  @@ -22,12 +22,12 @@
    *
    *
    * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
  - * @version $Revision: 1.4 $
  + * @version $Revision: 1.5 $
    */
   public class BasicUpdateRows extends AbstractAction
  -        implements UpdateRows, LogEnabled, 
SimpleWhereClauseMatchingRowCallback {
  +        implements UpdateRows, LogEnabled, BasicCriteriaMatchingRowCallback {
   
  -    private SimpleWhereClause mWhereClause;
  +    private BasicCriteria mBasicCriteria;
       private AbstractQueryable mQueryable;
       private int mRecordCount;
   
  @@ -39,9 +39,9 @@
        * @param document
        *
        */
  -    public BasicUpdateRows(AbstractQueryable queryable, SimpleWhereClause 
whereClause) {
  +    public BasicUpdateRows(AbstractQueryable queryable, BasicCriteria 
basicCriteria) {
           mQueryable = queryable;
  -        mWhereClause = whereClause;
  +        mBasicCriteria = basicCriteria;
       }
   
       public void initialize() throws ActionException {
  @@ -60,7 +60,7 @@
           while(it.hasNext()) {
               /** iterate rows and select only the needed cols */
               BasicRow row = (BasicRow)it.next();
  -            if (mWhereClause.testActionRow(row)) {
  +            if (mBasicCriteria.testActionRow(row)) {
                   rowMatches(row,true);
               }
           }
  
  
  
  1.2       +5 -5      
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicSelectSimple.java
  
  Index: BasicSelectSimple.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicSelectSimple.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BasicSelectSimple.java    2001/11/29 08:46:25     1.1
  +++ BasicSelectSimple.java    2001/11/29 10:35:26     1.2
  @@ -29,7 +29,7 @@
    * @author Gerhard Froehlich <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
    * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
    *
  - * @version $Revision: 1.1 $
  + * @version $Revision: 1.2 $
    */
   public class BasicSelectSimple extends AbstractAction implements 
Select,ParameterAdaptable,LogEnabled {
   
  @@ -41,12 +41,12 @@
       private AbstractQueryable mQueryable;
       private Column[] mCols;
       private String[] mTablenames;
  -    private SimpleWhereClause mSimpleWhereClause;
  +    private BasicCriteria mBasicCriteria;
   
  -    public BasicSelectSimple(String[] tableNames, Column[] columns, 
SimpleWhereClause whereClause) {
  +    public BasicSelectSimple(String[] tableNames, Column[] columns, 
BasicCriteria basicCriteria) {
           mTablenames = tableNames;
           mCols = columns;
  -        mSimpleWhereClause = whereClause;
  +        mBasicCriteria = basicCriteria;
       }
   
       public void initialize() throws ActionException {
  @@ -71,7 +71,7 @@
               while(it.hasNext()) {
                   /** iterate rows and select only the needed cols */
                   BasicRow row = (BasicRow)it.next();
  -                if (mSimpleWhereClause.testActionRow(row)) {
  +                if (mBasicCriteria.testActionRow(row)) {
                       getLogger().debug("specific select=" + mCols);
                       selectedRow = new Object[mCols.length];
                       for (int j=0; j < mCols.length; j++) {
  
  
  
  1.6       +5 -5      
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicDeleteRows.java
  
  Index: BasicDeleteRows.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicDeleteRows.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- BasicDeleteRows.java      2001/11/23 13:32:32     1.5
  +++ BasicDeleteRows.java      2001/11/29 10:35:26     1.6
  @@ -26,12 +26,12 @@
    *
    *
    * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
  - * @version $Revision: 1.5 $
  + * @version $Revision: 1.6 $
    */
   public class BasicDeleteRows extends AbstractAction
           implements DeleteRows, LogEnabled {
   
  -    private SimpleWhereClause mWhereClause;
  +    private BasicCriteria mBasicCriteria;
       private AbstractQueryable mQueryable;
       private AbstractTable mTable;
       private int mRecordCount;
  @@ -44,9 +44,9 @@
        * @param document
        *
        */
  -    public BasicDeleteRows(AbstractQueryable queryable, SimpleWhereClause 
whereClause) {
  +    public BasicDeleteRows(AbstractQueryable queryable, BasicCriteria 
basicCriteria) {
           mQueryable = queryable;
  -        mWhereClause = whereClause;
  +        mBasicCriteria = basicCriteria;
       }
   
       public void initialize() throws ActionException {
  @@ -90,7 +90,7 @@
           while(it.hasNext()) {
               /** iterate rows and select only the needed cols */
               BasicRow row = (BasicRow)it.next();
  -            if (mWhereClause.testActionRow(row)) {
  +            if (mBasicCriteria.testActionRow(row)) {
                   pendingDeletes.add(row);
               }
           }
  
  
  
  1.14      +5 -5      
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicCreateView.java
  
  Index: BasicCreateView.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicCreateView.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- BasicCreateView.java      2001/11/18 20:47:20     1.13
  +++ BasicCreateView.java      2001/11/29 10:35:26     1.14
  @@ -27,18 +27,18 @@
    *
    *
    * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
  - * @version $Revision: 1.13 $
  + * @version $Revision: 1.14 $
    */
   public class BasicCreateView extends BasicCreateQueryable implements 
CreateView {
   
       private String mViewName, mOnName;
  -    private SimpleWhereClause mSimpleWhereClause;
  +    private BasicCriteria mBasicCriteria;
   
  -    public BasicCreateView(String viewName, String onName, Column[] columns 
,SimpleWhereClause simpleWhereClause) {
  +    public BasicCreateView(String viewName, String onName, Column[] columns 
,BasicCriteria basicCriteria) {
           super(columns);
           mViewName = viewName;
           mOnName = onName;
  -        mSimpleWhereClause = simpleWhereClause;
  +        mBasicCriteria = basicCriteria;
       }
   
       public void initialize() throws ActionException {
  @@ -55,7 +55,7 @@
   
           Queryable queryable = mDatabasePersistor.getQueryable(mOnName);
   
  -        BasicView view = new BasicView(mViewName, mColumns, queryable 
,mSimpleWhereClause);
  +        BasicView view = new BasicView(mViewName, mColumns, queryable, 
mBasicCriteria);
           view.enableLogging(this.getLogger());
   
   
  
  
  
  1.2       +5 -5      
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicCreateAggregateView.java
  
  Index: BasicCreateAggregateView.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicCreateAggregateView.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BasicCreateAggregateView.java     2001/11/24 20:26:12     1.1
  +++ BasicCreateAggregateView.java     2001/11/29 10:35:26     1.2
  @@ -26,18 +26,18 @@
    *
    *
    * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
  - * @version $Revision: 1.1 $
  + * @version $Revision: 1.2 $
    */
   public class BasicCreateAggregateView extends BasicCreateQueryable 
implements CreateAggregateView {
   
       private String mViewName, mOnName;
  -    private SimpleWhereClause mSimpleWhereClause;
  +    private BasicCriteria mBasicCriteria;
   
  -    public BasicCreateAggregateView(String viewName, String onName, Column[] 
columns ,SimpleWhereClause simpleWhereClause) {
  +    public BasicCreateAggregateView(String viewName, String onName, Column[] 
columns, BasicCriteria basicCriteria) {
           super(columns);
           mViewName = viewName;
           mOnName = onName;
  -        mSimpleWhereClause = simpleWhereClause;
  +        mBasicCriteria = basicCriteria;
       }
   
       public void initialize() throws ActionException {
  @@ -54,7 +54,7 @@
   
           Queryable queryable = mDatabasePersistor.getQueryable(mOnName);
   
  -        BasicView view = new BasicView(mViewName, mColumns, queryable 
,mSimpleWhereClause);
  +        BasicView view = new BasicView(mViewName, mColumns, queryable 
,mBasicCriteria);
           view.enableLogging(this.getLogger());
   
   
  
  
  
  1.1                  
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicLXSQLCriteriaHelper.java
  
  Index: BasicLXSQLCriteriaHelper.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.db.basic.actions;
  
  import org.apache.avalon.db.actions.ActionException;
  import org.apache.avalon.db.data.ValidationException;
  
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  
  import org.apache.regexp.RE;
  import org.apache.regexp.RESyntaxException;
  
  import org.w3c.dom.Element;
  import org.w3c.dom.NodeList;
  
  import java.util.Hashtable;
  import java.util.Enumeration;
  
  /**
   * Class BasicLXSQLCriteriaHelper
   *
   * @author Gerhard Froehlich <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
   * @version $Revision: 1.3 $
   */
  public class BasicLXSQLCriteriaHelper extends AbstractLogEnabled {
  
      private String mWhereClause;
      private StringBuffer mWhereBuffer;
      private static Hashtable mOperators;
      static {
          mOperators = new Hashtable();
          addOperator("=","testEqual");
          addOperator(">","testGreaterThan");
          addOperator("<","testSmallerThan");
          addOperator("<>","testNotEqual");
          addOperator("<=","testSmallerThanOrEqual");
          addOperator(">=","testGreaterThanOrEqual");
          addOperator("like","testLike");
      }
      private static void addOperator(String operator, String method) {
          mOperators.put(operator,method);
      }
  
      public BasicLXSQLCriteriaHelper(Element rootElement) {
          try {
              parseLXSQL(rootElement);
          } catch (ActionException ae) {
              ae.printStackTrace();
          }
          mWhereClause = mWhereBuffer.toString();
      }
  
      public String getCriteria() {
          return mWhereClause;
      }
  
      private void parseLXSQL(Element rootElement) throws ActionException {
          NodeList subRootNodes = this.getSubRootNodes(rootElement);
          boolean whereDone = false;
          StringBuffer whereBuffer = new StringBuffer();
          int indent = 0;
  
          try {
              for (int i=0; i < subRootNodes.getLength(); i++) {
                  if(subRootNodes.item(i).getNodeName().equals("where")) {
                      if (whereDone) {
                          throw new ActionException("<where> term must only be 
specified once");
                      }
                      Element whereElement = (Element)subRootNodes.item(i);
                      NodeList elements = whereElement.getChildNodes();
                      for (int j=0; j < elements.getLength(); j++) {
                          Element element = (Element)elements.item(j);
                          parseWhereTerm(element, whereBuffer, indent+1);
                      }
                      whereDone = true;
                  }
              }
          } catch (ValidationException ve) {
              throw new ActionException("Validation Exception: " + 
ve.getMessage());
          }
          mWhereBuffer = whereBuffer;
          //getLogger().debug("sb=[\n" + whereBuffer + "\n]");
      }
  
      private void parseWhereTerm(Element element, StringBuffer sb, int indent) 
throws ValidationException {
          if(element != null) {
              //getLogger().debug("Element != null " + element);
              if(element.getTagName().equals("and")) {
                  //getLogger().debug("parseWhereTerm(): found and");
                  parseWhereAndOrTerm(element.getChildNodes(),sb, indent, "&");
              } else if(element.getTagName().equals("or")) {
                  //getLogger().debug("parseWhereTerm(): found or");
                  parseWhereAndOrTerm(element.getChildNodes(),sb, indent, "|");
              } else if(element.getTagName().equals("condition")) {
                  //getLogger().debug("parseWhereTerm(): found condition");
                  parseWhereConditionTerm(element,sb,indent);
              } else {
                  throw new ValidationException("Unknown where term " + 
element.getTagName());
              }
          } else {
              //getLogger().debug("Element == null " + element);
              //getLogger().debug("parseWhereTerm after if");
              throw new ValidationException("Null where element");
          }
          //getLogger().debug("parseWhereTerm at the end");
      }
  
      private void parseWhereAndOrTerm(NodeList nodes, StringBuffer sb, int 
indent, String andOr) {
          sb.append(getIndent(indent) + "(\n");
          try {
              for(int i=0; i<nodes.getLength(); i++) {
                  //getLogger().debug("Looping and/or");
                  parseWhereTerm((Element)nodes.item(i),sb, indent +1);
                  if (i+1 < nodes.getLength()) {
                    sb.append( getIndent(indent) + andOr + "\n");
                  }
              }
          } catch(Exception e) {
              e.printStackTrace();
          }
          sb.append(getIndent(indent) + ")\n");
      }
  
      private void parseWhereConditionTerm(Element element, StringBuffer sb, 
int indent) {
          try {
              //getLogger().debug("parseWhereConditionTerm(): found condition");
              sb.append(getIndent(indent) + 
composeExpr(element.getAttribute("expr")) + "\n");
          } catch(Exception e) {
              e.printStackTrace();
          }
      }
  
      private String getIndent(int indent) {
          String rval = "";
          for (int f = 0; f < indent; f++) {
              rval = rval + "  ";
          }
          return rval;
      }
  
      private String composeExpr(String expr) {
          String[] strarr = null;
          String[] result = null;
          String method = null;
          String operator = null;
          //getLogger().debug("expr=" + expr);
          try {
              Enumeration enum = mOperators.keys();
              //getLogger().debug("mOperators.size()=" + mOperators.size());
              while(enum.hasMoreElements()) {
                  operator = (String)enum.nextElement();
                  //getLogger().debug("matching operator = " + operator);
                  //getLogger().debug("matching function = " + 
mOperators.get(operator));
                  RE re = new RE(operator);
                  strarr = re.split(expr);
                  if(strarr.length > 1) {
                      method = (String)mOperators.get(operator);
                      //getLogger().debug("matched function = " + method);
                      result = strarr;
                  }
              }
              method = "testHelper." + method + "(columnCheck.getColumn(row,\"" 
+ result[0]
                       + "\"),columnCheck.getColumn(row,\"" + result[1] + 
"\"),row)";
              //getLogger().debug("method=" + method);
  
          } catch (RESyntaxException rse) {
              //getLogger().error("composeExpr(): RESyntaxException",rse);
          } catch (Exception e) {
              //getLogger().error("composeExpr(): Exception",e);
          }
          return method;
      }
  
      private NodeList getSubRootNodes(Element rootElement) {
          return rootElement.getChildNodes();
      }
  }
  
  
  1.1                  
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicCriteriaMatchingRowCallback.java
  
  Index: BasicCriteriaMatchingRowCallback.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.db.basic.actions;
  
  import org.apache.avalon.db.basic.data.BasicRow;
  
  /**
   * Class BasicCriteriaMatchingRowCallback
   *
   * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
   * @version $Revision: 1.2 $
   */
  public interface BasicCriteriaMatchingRowCallback {
  
      void rowMatches(BasicRow row, boolean matches);
  }
  
  
  
  1.1                  
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicCriteria.java
  
  Index: BasicCriteria.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.db.basic.actions;
  
  import org.apache.avalon.db.actions.ActionException;
  import org.apache.avalon.db.basic.data.BasicRow;
  import org.apache.avalon.db.utils.RhinoHelper;
  import org.apache.avalon.db.utils.RhinoException;
  import org.apache.avalon.db.data.Column;
  import org.apache.avalon.db.data.DataException;
  import org.apache.avalon.db.data.impl.DefaultStringConstantColumn;
  
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  
  import java.util.Iterator;
  
  /**
   * Class BasicCriteria
   *
   *
   * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
   * @author Gerhard Froehlich <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
   * @version $Revision: 1.7 $
   */
  public class BasicCriteria extends AbstractLogEnabled {
  
      private String mWhereClause;
      private String[] mTablenames;
      private String mMatchingInstructions = "callBack.rowMatches(row, 
true);\n";
      private String mUnMatchingInstructions = "callBack.rowMatches(row, 
false);\n";
  
      public BasicCriteria(String Criteria, String matchingInstructions,  
String unMatchingInstructions) {
          this(Criteria);
          mMatchingInstructions = matchingInstructions;
          mUnMatchingInstructions = unMatchingInstructions;
      }
  
      public BasicCriteria(String Criteria) {
          try {
              setupLogger(this);
              mWhereClause = Criteria;
          } catch (Exception e) {
              ////getLogger().error("SimpleWhereClause(..): Exception:",e);
          }
      }
  
      public String getWhereClause() {
          return mWhereClause;
      }
  
      public void testDataRows(Iterator rowIterator, 
BasicCriteriaMatchingRowCallback callBack) throws DataException {
          try {
              testRows(rowIterator, callBack);
          } catch (RhinoException re) {
              throw new DataException(re.getMessage());
          }
      }
  
      public void testActionRows(Iterator rowIterator, 
BasicCriteriaMatchingRowCallback callBack) throws ActionException {
          try {
              testRows(rowIterator, callBack);
          } catch (RhinoException re) {
              throw new ActionException(re.getMessage());
          }
      }
  
      private void testRows(Iterator rowIterator, 
BasicCriteriaMatchingRowCallback callBack) throws RhinoException {
          RhinoHelper rh = new RhinoHelper();
          TestHelper testHelper = new TestHelper();
          ColumnCheck columnCheck = new ColumnCheck();
  
          rh.addBean("iterator",rowIterator);
          rh.addBean("callBack",callBack);
          rh.addBean("columnCheck",columnCheck);
          rh.addBean("testHelper",testHelper);
          //getLogger().debug("mWhereClause" + mWhereClause.toString());
          String js =
              "var more = iterator.hasNext();\n" +
              "if (more) {\n" +
                "do {\n" +
                  "var row = iterator.next();\n" +
                  "if ( " + mWhereClause + " ) {\n" +
                    mMatchingInstructions +
                  "} else {\n" +
                    mUnMatchingInstructions +
                  "}\n" +
                "} while(iterator.hasNext())\n" +
              "}\n";
          System.out.println("js::" + js);
          rh.executeScript(js);
      }
  
      public boolean testDataRow(BasicRow row) throws DataException {
          try {
              return testRow(row);
          } catch (RhinoException re) {
              throw new DataException(re.getMessage());
          }
      }
  
      public boolean testActionRow(BasicRow row) throws ActionException {
          try {
              return testRow(row);
          } catch (RhinoException re) {
              throw new ActionException(re.getMessage());
          }
      }
  
      private boolean testRow(BasicRow row) throws RhinoException {
          if(!mWhereClause.toString().equals("")) {
              RhinoHelper rh = new RhinoHelper();
              MatchingHelper mh = new MatchingHelper();
              ColumnCheck columnCheck = new ColumnCheck();
  
              rh.addBean("row",row);
              rh.addBean("callBack",mh);
              rh.addBean("columnCheck",columnCheck);
              TestHelper testHelper = new TestHelper();
              rh.addBean("testHelper",testHelper);
              //getLogger().debug("mWhereClause" + mWhereClause.toString());
              rh.executeScript(
                   "if (" + mWhereClause.toString() + ") { " +
                    mMatchingInstructions +
                   "} else {" +
                    mUnMatchingInstructions +
                   "}");
              return mh.mMatched;
          } else {
              return true;
          }
      }
  
      public class MatchingHelper implements BasicCriteriaMatchingRowCallback {
          public boolean mMatched = false;
          public void rowMatches(BasicRow row, boolean matched) {
              mMatched = matched;
          }
      }
  
      public class ColumnCheck {
         public Column getColumn(BasicRow row, String name) {
              if(row.getValue(name) == null) {
                  return getConstantColumn("constantcolumn",name);
              } else {
                  return (Column)row.getColumn(name,false);
              }
         }
  
         private Column getConstantColumn(String name, String value) {
              return new DefaultStringConstantColumn(name,value);
         }
      }
  }
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to