hammant     01/12/18 15:34:33

  Modified:    apps/db/src/java/org/apache/avalon/db/basic/actions
                        BasicCriteria.java
               apps/db/src/java/org/apache/avalon/db/basic/handlers/lxsql
                        BasicLXSQLHandler.java
                        BasicLXSQLSelectSimpleHandler.java
                        BasicLXSQLUpdateRowsHandler.java
               apps/db/src/java/org/apache/avalon/db/functions
                        Function.java NumericFunction.java
               apps/db/src/java/org/apache/avalon/db/functions/impl
                        ConcatFunction.java LowerCaseStringFunction.java
                        SubStringFunction.java TrimStringFunction.java
                        UpperCaseStringFunction.java
               apps/db/src/scripts/lxsql Test2.script
  Added:       apps/db/src/java/org/apache/avalon/db/basic/handlers
                        ContrivedColumnNameHolder.java
               apps/db/src/java/org/apache/avalon/db/basic/handlers/lxsql
                        BasicLXSQLSecondaryHandler.java
  Log:
  functions in set in updates now works.
  
  Revision  Changes    Path
  1.4       +17 -1     
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicCriteria.java
  
  Index: BasicCriteria.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicCriteria.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- BasicCriteria.java        2001/12/02 14:45:57     1.3
  +++ BasicCriteria.java        2001/12/18 23:34:32     1.4
  @@ -37,13 +37,23 @@
       private String[] mTablenames;
       private String mMatchingInstructions = "callBack.rowMatches(row, 
true);\n";
       private String mUnMatchingInstructions = "callBack.rowMatches(row, 
false);\n";
  +    private Column[] mTempColumns;
   
  -    public BasicCriteria(String Criteria, String matchingInstructions,  
String unMatchingInstructions) {
  +    public BasicCriteria(String Criteria, String matchingInstructions,
  +               String unMatchingInstructions, Column[] tempColumns) {
           this(Criteria);
           mMatchingInstructions = matchingInstructions;
           mUnMatchingInstructions = unMatchingInstructions;
  +        mTempColumns = tempColumns;
       }
   
  +    public BasicCriteria(String Criteria, String matchingInstructions,
  +               String unMatchingInstructions) {
  +        this(Criteria);
  +        mMatchingInstructions = matchingInstructions;
  +        mUnMatchingInstructions = unMatchingInstructions;
  +    }
  +
       public BasicCriteria(String Criteria) {
           try {
               setupLogger(this);
  @@ -81,6 +91,9 @@
   
           rh.addBean("iterator",rowIterator);
           rh.addBean("callBack",callBack);
  +        if (mTempColumns != null) {
  +            rh.addBean("tempColumns",mTempColumns);
  +        }
           rh.addBean("columnCheckLeft",columnCheckLeft);
           rh.addBean("columnCheckRight",columnCheckRight);
           rh.addBean("testHelper",testHelper);
  @@ -126,6 +139,9 @@
   
               rh.addBean("row",row);
               rh.addBean("callBack",mh);
  +            if (mTempColumns != null) {
  +                rh.addBean("tempColumns",mTempColumns);
  +            }
               rh.addBean("columnCheckRight",columnCheckRight);
               rh.addBean("columnCheckLeft",columnCheckLeft);
               TestHelper testHelper = new TestHelper();
  
  
  
  1.1                  
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/handlers/ContrivedColumnNameHolder.java
  
  Index: ContrivedColumnNameHolder.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.handlers;
  
  public class ContrivedColumnNameHolder {
  
      int mColNumber;
  
      public String getNextColumn() {
          return "C" + mColNumber++;
      }
  }
  
  
  
  1.5       +5 -1      
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/handlers/lxsql/BasicLXSQLHandler.java
  
  Index: BasicLXSQLHandler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/handlers/lxsql/BasicLXSQLHandler.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- BasicLXSQLHandler.java    2001/12/03 11:18:35     1.4
  +++ BasicLXSQLHandler.java    2001/12/18 23:34:33     1.5
  @@ -20,7 +20,7 @@
    *
    *
    * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
  - * @version $Revision: 1.4 $
  + * @version $Revision: 1.5 $
    */
   public abstract class BasicLXSQLHandler extends AbstractRequestHandler {
   
  @@ -38,4 +38,8 @@
           super(databasePersistor);
           mParser = parser;
       }
  +
  +
  +
  +
   }
  
  
  
  1.13      +5 -145    
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/handlers/lxsql/BasicLXSQLSelectSimpleHandler.java
  
  Index: BasicLXSQLSelectSimpleHandler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/handlers/lxsql/BasicLXSQLSelectSimpleHandler.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- BasicLXSQLSelectSimpleHandler.java        2001/12/18 20:21:26     1.12
  +++ BasicLXSQLSelectSimpleHandler.java        2001/12/18 23:34:33     1.13
  @@ -10,6 +10,7 @@
   import org.apache.avalon.db.basic.parser.BasicLXSQLParserManager;
   import org.apache.avalon.db.basic.actions.BasicSelectSimple;
   import org.apache.avalon.db.basic.actions.BasicCriteria;
  +import org.apache.avalon.db.basic.handlers.ContrivedColumnNameHolder;
   import org.apache.avalon.db.services.DatabasePersistor;
   import org.apache.avalon.db.transport.Reply;
   import org.apache.avalon.db.transport.Request;
  @@ -52,9 +53,9 @@
    *
   * @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.12 $
  + * @version $Revision: 1.13 $
    */
  -public class BasicLXSQLSelectSimpleHandler extends BasicLXSQLHandler {
  +public class BasicLXSQLSelectSimpleHandler extends 
BasicLXSQLSecondaryHandler {
   
       /**
        * Constructor BasicLXSQLSelectSimpleHandler
  @@ -141,6 +142,7 @@
                   if (subRootNodes.item(i).hasChildNodes()) {
                       NodeList subColumnsNodes = 
subRootNodes.item(i).getChildNodes();
                       Vector colVec = new Vector();
  +                    ContrivedColumnNameHolder colHldr = new 
ContrivedColumnNameHolder();
                       for (int j=0; j < subColumnsNodes.getLength(); j++) {
                           String nodeName = 
subColumnsNodes.item(j).getNodeName();
                           if (nodeName.equals("#text")) {
  @@ -153,7 +155,7 @@
                                       colVec.add(cs[f]);
                                   }
                               } else {
  -                                colVec.add(getSelectColumn(queryable 
,(Element) subColumnsNodes.item(j)));
  +                                colVec.add(getSelectColumn(queryable 
,(Element) subColumnsNodes.item(j), colHldr));
                               }
                           }
                       }
  @@ -168,149 +170,7 @@
           return cols;
       }
   
  -    private boolean isAllColumns(Element elem) {
  -        String nodeName = elem.getNodeName();
  -        if (nodeName.equals("column")) {
  -            String name = elem.getAttribute("name");
  -            if (name.equals("*")) {
  -                return true;
  -            }
  -        }
  -        return false;
  -    }
  -
  -    private Column getSelectColumn(AbstractQueryable queryable, Element 
elem) throws ActionException {
  -
  -        String nodeName = elem.getNodeName();
  -
  -        if (nodeName.equals("column")) {
  -            return getSelectColumnColumn(queryable, elem);
  -        } else if (nodeName.equals("concat")) {
  -            return getSelectColumnConcat(queryable, elem);
  -        } else if (nodeName.equals("const")) {
  -            return getSelectColumnConst(queryable, elem);
  -        } else if (nodeName.equals("trim")) {
  -            return getStringColumnFromStringFunction(queryable, elem, new 
TrimStringFunction());
  -        } else if (nodeName.equals("lowercase")) {
  -            return getStringColumnFromStringFunction(queryable, elem, new 
LowerCaseStringFunction());
  -        } else if (nodeName.equals("uppercase")) {
  -            return getStringColumnFromStringFunction(queryable, elem, new 
UpperCaseStringFunction());
  -        } else if (nodeName.equals("position")) {
  -            return getIntegerColumnFromIntegerFunction(queryable, elem, new 
PositionFunction());
  -        } else if (nodeName.equals("addition")) {
  -            return getIntegerColumnFromIntegerFunction(queryable, elem, new 
IntegerAdditionFunction());
  -        } else if (nodeName.equals("subtraction")) {
  -            return getIntegerColumnFromIntegerFunction(queryable, elem, new 
IntegerSubtractionFunction());
  -        } else if (nodeName.equals("multiplication")) {
  -            return getIntegerColumnFromIntegerFunction(queryable, elem, new 
IntegerMultiplicationFunction());
  -        } else if (nodeName.equals("division")) {
  -            return getIntegerColumnFromIntegerFunction(queryable, elem, new 
IntegerDivisionFunction());
  -        } else {
  -            throw new ActionException("Unknown node type '"+nodeName+"' 
under 'columns'");
  -        }
  -
  -
  -    }
  -
  -    private Column getSelectColumnColumn(AbstractQueryable queryable, 
Element elem) throws ActionException {
  -        String name = elem.getAttribute("name");
  -        return queryable.getColumn(name, true);
  -    }
  -
  -    private Column getSelectColumnConcat(AbstractQueryable queryable, 
Element concatElem) throws ActionException {
  -        String as = concatElem.getAttribute("as");
  -        // TODO as might be missing
  -        //return queryable.getColumn(name, true);
  -        if (concatElem.hasChildNodes()) {
  -            NodeList subConcatNodes = concatElem.getChildNodes();
  -            Vector colVec = new Vector();
  -            for (int j=0; j < subConcatNodes.getLength(); j++) {
  -                Node node = subConcatNodes.item(j);
  -                String nodeName =  node.getNodeName();
  -                if (nodeName.equals("#text")) {
  -                    // do nothing
  -                } else {
  -                    colVec.add(getSelectColumn(queryable,(Element) node));
  -                }
  -            }
  -            Column[] cols = new Column[colVec.size()];
  -            colVec.copyInto(cols);
  -            ConcatFunction cf = new ConcatFunction();
  -            cf.initialize(cols);
  -            return new DefaultContrivedStringFunctionColumn(as,cf);
  -        } else {
  -            throw new ActionException("concat must have child elements");
  -        }
  -    }
   
  -    private Column getSelectColumnConst(AbstractQueryable queryable, Element 
elem) throws ActionException {
  -        String value = elem.getAttribute("value");
  -        // TODO more types
  -        try {
  -            return new 
DefaultIntegerConstantColumn("TODO",Integer.parseInt(value));
  -        } catch (java.lang.NumberFormatException nfe) {
  -            return new DefaultStringConstantColumn("TODO",value);
  -        }
  -
  -    }
  -
  -    private Column getStringColumnFromStringFunction(AbstractQueryable 
queryable, Element aElem, StringFunction function) throws ActionException {
  -        String as = aElem.getAttribute("as");
  -        // TODO as might be missing
  -        //return queryable.getColumn(name, true);
  -        int count = 0;
  -        if (aElem.hasChildNodes()) {
  -            NodeList subConcatNodes = aElem.getChildNodes();
  -            Vector colVec = new Vector();
  -            for (int j=0; j < subConcatNodes.getLength(); j++) {
  -                Node node = subConcatNodes.item(j);
  -                String nodeName =  node.getNodeName();
  -                if (nodeName.equals("#text")) {
  -                    // do nothing
  -                } else {
  -                    count++;
  -                    colVec.add(getSelectColumn(queryable,(Element) node));
  -                }
  -            }
  -            if (colVec.size() > 1) {
  -                throw new ActionException("String function 
"+aElem.getNodeName()+" can only have one child column");
  -            }
  -            function.initialize((Column) colVec.elementAt(0));
  -            return new DefaultContrivedStringFunctionColumn(as,function);
  -        } else {
  -            throw new ActionException("String function 
"+aElem.getNodeName()+" must have child column");
  -        }
  -    }
  -
  -    private Column getIntegerColumnFromIntegerFunction(AbstractQueryable 
queryable, Element aElem, NumericFunction function) throws ActionException {
  -        String as = aElem.getAttribute("as");
  -        // TODO as might be missing
  -        //return queryable.getColumn(name, true);
  -        int count = 0;
  -        if (aElem.hasChildNodes()) {
  -            NodeList subConcatNodes = aElem.getChildNodes();
  -            Vector colVec = new Vector();
  -            for (int j=0; j < subConcatNodes.getLength(); j++) {
  -                Node node = subConcatNodes.item(j);
  -                String nodeName =  node.getNodeName();
  -                if (nodeName.equals("#text")) {
  -                    // do nothing
  -                } else {
  -                    count++;
  -                    colVec.add(getSelectColumn(queryable,(Element) node));
  -                }
  -            }
  -            if (colVec.size() > function.getMaxCols() | colVec.size() < 
function.getMinCols() ) {
  -                throw new ActionException("Numeric function 
"+aElem.getNodeName()+" must have between "+function.getMinCols()+" and 
"+function.getMaxCols()+" ");
  -            }
  -            Column[] cols = new Column[colVec.size()];
  -            colVec.copyInto(cols);
  -            function.initialize(cols);
  -            return new DefaultContrivedIntegerFunctionColumn(as,function);
  -        } else {
  -            throw new ActionException("Numeric function 
"+aElem.getNodeName()+" must have child column");
  -        }
  -    }
   
   
   }
  
  
  
  1.13      +47 -11    
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/handlers/lxsql/BasicLXSQLUpdateRowsHandler.java
  
  Index: BasicLXSQLUpdateRowsHandler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/handlers/lxsql/BasicLXSQLUpdateRowsHandler.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- BasicLXSQLUpdateRowsHandler.java  2001/12/06 00:54:45     1.12
  +++ BasicLXSQLUpdateRowsHandler.java  2001/12/18 23:34:33     1.13
  @@ -11,6 +11,7 @@
   import org.apache.avalon.db.basic.parser.BasicLXSQLParserManager;
   import org.apache.avalon.db.basic.actions.BasicUpdateRows;
   import org.apache.avalon.db.basic.actions.BasicCriteria;
  +import org.apache.avalon.db.basic.handlers.ContrivedColumnNameHolder;
   import org.apache.avalon.db.services.DatabasePersistor;
   import org.apache.avalon.db.transport.Reply;
   import org.apache.avalon.db.transport.Request;
  @@ -28,15 +29,17 @@
   import org.w3c.dom.NodeList;
   import org.w3c.dom.Node;
   
  +import java.util.Vector;
   
  +
   /**
    * Class BasicLXSQLUpdateRowsHandler
    *
    *
    * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
  - * @version $Revision: 1.12 $
  + * @version $Revision: 1.13 $
    */
  -public class BasicLXSQLUpdateRowsHandler extends BasicLXSQLHandler {
  +public class BasicLXSQLUpdateRowsHandler extends BasicLXSQLSecondaryHandler {
   
       /**
        * Constructor BasicLXSQLUpdateRowsHandler
  @@ -69,24 +72,33 @@
           Element rootElement = doc.getDocumentElement();
           String queryableStr = rootElement.getAttribute("from");
           AbstractConstituentQueryable queryable = 
(AbstractConstituentQueryable) mDatabasePersistor.getQueryable(queryableStr);
  +
  +        ContrivedColumnNameHolder colHldr = new ContrivedColumnNameHolder();
   
  -        String matchingInstructions = null;
  +        StringBuffer instructionBuffer = new StringBuffer();
  +        Vector temporaryColumns = new Vector();
   
           NodeList subRootNodes = rootElement.getChildNodes();
           for (int i=0; i < subRootNodes.getLength(); i++) {
               if(subRootNodes.item(i).getNodeName().equals("updates")) {
  -                matchingInstructions = getMatchingInstructions((Element) 
subRootNodes.item(i));
  +                setMatchingInstructions(queryable, colHldr, 
temporaryColumns, instructionBuffer, (Element) subRootNodes.item(i));
               }
           }
   
           BasicLXSQLCriteriaHelper basicCriteriaHelper = new 
BasicLXSQLCriteriaHelper(rootElement);
           basicCriteriaHelper.enableLogging(super.getLogger());
   
  +        Column[] cols = new Column[temporaryColumns.size()];
  +        temporaryColumns.copyInto(cols);
  +
  +        System.out.println(">>> " + instructionBuffer.toString());
  +
  +
           UpdateRows action = new BasicUpdateRows(
                                       (AbstractConstituentQueryable) queryable,
                                       new BasicCriteria(
                                               
basicCriteriaHelper.getCriteria(),
  -                                            matchingInstructions, "")
  +                                            instructionBuffer.toString(), 
"", cols)
                                       );
   
           mParser.initializeAction(action);
  @@ -95,26 +107,50 @@
           return new WriteReply(action.getRecordCount());
       }
   
  -   private String getMatchingInstructions(Element updatesElement) throws 
ActionException {
  +   private void setMatchingInstructions(AbstractQueryable abstractQueryable,
  +            ContrivedColumnNameHolder colHldr,  Vector temporaryColumns,
  +            StringBuffer instructionBuffer, Element updatesElement) throws 
ActionException {
           NodeList subUpdatesNodes = updatesElement.getChildNodes();
  -        StringBuffer instructionBuffer = new StringBuffer();
           for (int i=0; i < subUpdatesNodes.getLength(); i++) {
               String nodeName = subUpdatesNodes.item(i).getNodeName();
               if (nodeName.equals("set")) {
  -                setSetInstruction((Element) subUpdatesNodes.item(i), 
instructionBuffer);
  +                setSetInstruction(abstractQueryable, colHldr, (Element) 
subUpdatesNodes.item(i),
  +                        instructionBuffer, temporaryColumns);
               } else if(nodeName.equals("#text")) {
                   // ignore
               } else {
                   throw new ActionException("Element 'set' is the only element 
allowed beneath 'updates'");
               }
           }
  -       return instructionBuffer.toString();
      }
   
  -   private void setSetInstruction(Element setElement, StringBuffer 
instructionBuffer) throws ActionException {
  +   private void setSetInstruction(AbstractQueryable abstractQueryable, 
ContrivedColumnNameHolder colHldr, Element setElement,
  +                  StringBuffer instructionBuffer,
  +                  Vector tempColumns) throws ActionException {
          String name = setElement.getAttribute("name");
          String value = setElement.getAttribute("value");
  -       instructionBuffer.append("row.setValue('"+name+"','" + value + 
"');\n");
  +       if (!value.equals("")) {
  +           instructionBuffer.append("row.setValue('"+name+"','" + value + 
"');\n");
  +       } else {
  +           NodeList subSetNodes = setElement.getChildNodes();
  +           Column col = null;
  +           int ct = 0;
  +           for (int i=0; i < subSetNodes.getLength(); i++) {
  +               String nodeName = subSetNodes.item(i).getNodeName();
  +               if(nodeName.equals("#text")) {
  +                   // do nothing
  +               } else {
  +                   ct++;
  +                   col = getSelectColumn(abstractQueryable,(Element) 
subSetNodes.item(i),colHldr);
  +               }
  +           }
  +           if (ct < 1 | ct > 1) {
  +               throw new ActionException("For element 'set' either attribute 
'value' must be specified or there must be columns as sub elements");
  +           }
  +           int ix = tempColumns.size(); // this will be the next index used
  +           tempColumns.add(col);
  +           
instructionBuffer.append("row.setValue('"+name+"',tempColumns["+ix+"].getValue(row));\n");
  +       }
      }
   
   }
  
  
  
  1.1                  
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/handlers/lxsql/BasicLXSQLSecondaryHandler.java
  
  Index: BasicLXSQLSecondaryHandler.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.handlers.lxsql;
  
  
  
  import org.apache.avalon.db.server.AbstractRequestHandler;
  import org.apache.avalon.db.basic.parser.BasicLXSQLParserManager;
  import org.apache.avalon.db.basic.handlers.ContrivedColumnNameHolder;
  import org.apache.avalon.db.services.DatabasePersistor;
  import org.apache.avalon.db.actions.ActionException;
  import org.apache.avalon.db.data.impl.AbstractQueryable;
  import org.apache.avalon.db.data.impl.DefaultIntegerConstantColumn;
  import org.apache.avalon.db.data.impl.DefaultStringConstantColumn;
  import org.apache.avalon.db.data.impl.DefaultContrivedStringFunctionColumn;
  import org.apache.avalon.db.data.impl.DefaultContrivedIntegerFunctionColumn;
  import org.apache.avalon.db.data.Column;
  import org.apache.avalon.db.functions.impl.IntegerDivisionFunction;
  import org.apache.avalon.db.functions.impl.IntegerMultiplicationFunction;
  import org.apache.avalon.db.functions.impl.IntegerSubtractionFunction;
  import org.apache.avalon.db.functions.impl.IntegerAdditionFunction;
  import org.apache.avalon.db.functions.impl.ConcatFunction;
  import org.apache.avalon.db.functions.impl.TrimStringFunction;
  import org.apache.avalon.db.functions.impl.LowerCaseStringFunction;
  import org.apache.avalon.db.functions.impl.UpperCaseStringFunction;
  import org.apache.avalon.db.functions.impl.PositionFunction;
  import org.apache.avalon.db.functions.StringFunction;
  import org.apache.avalon.db.functions.NumericFunction;
  import org.w3c.dom.Element;
  import org.w3c.dom.Node;
  import org.w3c.dom.NodeList;
  
  import java.util.Vector;
  
  
  /**
   * Class BasicLXSQLSecondaryHandler
   *
   *
   * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
   * @version $Revision: 1.1 $
   */
  public abstract class BasicLXSQLSecondaryHandler extends BasicLXSQLHandler {
  
      /**
       * Constructor BasicLXSQLSecondaryHandler
       *
       *
       * @param parser
       * @param databasePersistor
       *
       */
      public BasicLXSQLSecondaryHandler(BasicLXSQLParserManager parser, 
DatabasePersistor databasePersistor) {
          super(parser, databasePersistor);
      }
  
      protected boolean isAllColumns(Element elem) {
          String nodeName = elem.getNodeName();
          if (nodeName.equals("column")) {
              String name = elem.getAttribute("name");
              if (name.equals("*")) {
                  return true;
              }
          }
          return false;
      }
  
      protected Column getSelectColumn(AbstractQueryable queryable, Element 
elem, ContrivedColumnNameHolder colHldr) throws ActionException {
  
  
          String nodeName = elem.getNodeName();
  
          if (nodeName.equals("column")) {
              return getSelectColumnColumn(queryable, elem);
          } else if (nodeName.equals("concat")) {
              return getStringColumnFromStringFunction(queryable, elem, new 
ConcatFunction(), colHldr);
          } else if (nodeName.equals("const")) {
              return getColumnConst(queryable, elem, colHldr);
          } else if (nodeName.equals("trim")) {
              return getStringColumnFromStringFunction(queryable, elem, new 
TrimStringFunction(), colHldr);
          } else if (nodeName.equals("lowercase")) {
              return getStringColumnFromStringFunction(queryable, elem, new 
LowerCaseStringFunction(), colHldr);
          } else if (nodeName.equals("uppercase")) {
              return getStringColumnFromStringFunction(queryable, elem, new 
UpperCaseStringFunction(), colHldr);
          } else if (nodeName.equals("position")) {
              return getIntegerColumnFromIntegerFunction(queryable, elem, new 
PositionFunction(), colHldr);
          } else if (nodeName.equals("addition")) {
              return getIntegerColumnFromIntegerFunction(queryable, elem, new 
IntegerAdditionFunction(), colHldr);
          } else if (nodeName.equals("subtraction")) {
              return getIntegerColumnFromIntegerFunction(queryable, elem, new 
IntegerSubtractionFunction(), colHldr);
          } else if (nodeName.equals("multiplication")) {
              return getIntegerColumnFromIntegerFunction(queryable, elem, new 
IntegerMultiplicationFunction(), colHldr);
          } else if (nodeName.equals("division")) {
              return getIntegerColumnFromIntegerFunction(queryable, elem, new 
IntegerDivisionFunction(), colHldr);
          } else {
              throw new ActionException("Unknown node type '"+nodeName+"' under 
'columns'");
          }
  
  
      }
  
      protected Column getSelectColumnColumn(AbstractQueryable queryable, 
Element elem) throws ActionException {
          String name = elem.getAttribute("name");
          return queryable.getColumn(name, true);
      }
  
  
  
      protected Column getColumnConst(AbstractQueryable queryable, Element 
aElem,
              ContrivedColumnNameHolder colHldr) throws ActionException {
          String value = aElem.getAttribute("value");
          String as = aElem.getAttribute("as");
          if (as == null) {
              as = colHldr.getNextColumn();
          }
          // TODO more types
          try {
              return new 
DefaultIntegerConstantColumn(as,Integer.parseInt(value));
          } catch (java.lang.NumberFormatException nfe) {
              return new DefaultStringConstantColumn(as,value);
          }
  
      }
  
      protected Column getStringColumnFromStringFunction(AbstractQueryable 
queryable,
              Element aElem, StringFunction function, ContrivedColumnNameHolder 
colHldr) throws ActionException {
          String as = aElem.getAttribute("as");
          if (as == null) {
              as = colHldr.getNextColumn();
          }
          // TODO as might be missing
          //return queryable.getColumn(name, true);
          int count = 0;
          if (aElem.hasChildNodes()) {
              NodeList subConcatNodes = aElem.getChildNodes();
              Vector colVec = new Vector();
              for (int j=0; j < subConcatNodes.getLength(); j++) {
                  Node node = subConcatNodes.item(j);
  
                  String nodeName =  node.getNodeName();
                  if (nodeName.equals("#text")) {
                      // do nothing
                  } else {
                      count++;
                      colVec.add(getSelectColumn(queryable,(Element) node, 
colHldr));
                  }
              }
              if (colVec.size() > function.getMaxCols()) {
                  throw new ActionException("String function 
"+aElem.getNodeName()+" can only have "+function.getMaxCols()+" child columns");
              }
              Column[] cols = new Column[colVec.size()];
              colVec.copyInto(cols);
              function.initialize(cols);
              return new DefaultContrivedStringFunctionColumn(as,function);
          } else {
              throw new ActionException("String function 
"+aElem.getNodeName()+" must have child column");
          }
      }
  
      protected Column getIntegerColumnFromIntegerFunction(AbstractQueryable 
queryable, Element aElem,
              NumericFunction function, ContrivedColumnNameHolder colHldr) 
throws ActionException {
          String as = aElem.getAttribute("as");
          if (as == null) {
              as = colHldr.getNextColumn();
          }
          // TODO as might be missing
          //return queryable.getColumn(name, true);
          int count = 0;
          if (aElem.hasChildNodes()) {
              NodeList subConcatNodes = aElem.getChildNodes();
              Vector colVec = new Vector();
              for (int j=0; j < subConcatNodes.getLength(); j++) {
                  Node node = subConcatNodes.item(j);
                  String nodeName =  node.getNodeName();
                  if (nodeName.equals("#text")) {
                      // do nothing
                  } else {
                      count++;
                      colVec.add(getSelectColumn(queryable,(Element) node, 
colHldr));
                  }
              }
              if (colVec.size() > function.getMaxCols() | colVec.size() < 
function.getMinCols() ) {
                  throw new ActionException("Numeric function 
"+aElem.getNodeName()+" must have between "+function.getMinCols()+" and 
"+function.getMaxCols()+" ");
              }
              Column[] cols = new Column[colVec.size()];
              colVec.copyInto(cols);
              function.initialize(cols);
              return new DefaultContrivedIntegerFunctionColumn(as,function);
          } else {
              throw new ActionException("Numeric function 
"+aElem.getNodeName()+" must have child column");
          }
      }
  }
  
  
  
  1.8       +4 -1      
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/functions/Function.java
  
  Index: Function.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/functions/Function.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- Function.java     2001/12/18 14:24:53     1.7
  +++ Function.java     2001/12/18 23:34:33     1.8
  @@ -17,10 +17,13 @@
    *
    * @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.7 $
  + * @version * $Revision: 1.8 $
    */
   public interface Function {
       void initialize(Column columns);
       void initialize(Column[] columns);
       Object getValue(Row row);
  +
  +    int getMinCols();
  +    int getMaxCols();
   }
  
  
  
  1.3       +1 -4      
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/functions/NumericFunction.java
  
  Index: NumericFunction.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/functions/NumericFunction.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- NumericFunction.java      2001/12/18 19:25:24     1.2
  +++ NumericFunction.java      2001/12/18 23:34:33     1.3
  @@ -15,14 +15,11 @@
    * Interface NumericFunction
    *
    * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
  - * @version * $Revision: 1.2 $
  + * @version * $Revision: 1.3 $
    */
   public interface NumericFunction extends Function {
       int getIntValue(Row row);
       long getLongValue(Row row);
       float getFloatValue(Row row);
       double getDoubleValue(Row row);
  -
  -    int getMinCols();
  -    int getMaxCols();
   }
  
  
  
  1.5       +8 -1      
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/functions/impl/ConcatFunction.java
  
  Index: ConcatFunction.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/functions/impl/ConcatFunction.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ConcatFunction.java       2001/12/01 10:49:44     1.4
  +++ ConcatFunction.java       2001/12/18 23:34:33     1.5
  @@ -16,7 +16,7 @@
    * Class ConcatFunction
    *
    * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
  - * @version $Revision: 1.4 $
  + * @version $Revision: 1.5 $
    */
   public class ConcatFunction extends AbstractStringFunction {
   
  @@ -35,6 +35,13 @@
               maxLength+= sTyp.getMaxLength();
           }
           return maxLength;
  +    }
  +
  +    public int getMinCols() {
  +        return 2;
  +    }
  +    public int getMaxCols() {
  +        return 99;
       }
   
   }
  
  
  
  1.5       +9 -1      
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/functions/impl/LowerCaseStringFunction.java
  
  Index: LowerCaseStringFunction.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/functions/impl/LowerCaseStringFunction.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- LowerCaseStringFunction.java      2001/12/18 14:24:53     1.4
  +++ LowerCaseStringFunction.java      2001/12/18 23:34:33     1.5
  @@ -17,7 +17,7 @@
    * Class LowerCaseStringFunction
    *
    * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
  - * @version $Revision: 1.4 $
  + * @version $Revision: 1.5 $
    */
   public class LowerCaseStringFunction extends AbstractStringFunction {
   
  @@ -39,4 +39,12 @@
           StringColumn sTyp = (StringColumn) mColumns[0];
           return sTyp.getMaxLength();
       }
  +
  +    public int getMinCols() {
  +        return 1;
  +    }
  +    public int getMaxCols() {
  +        return 1;
  +    }
  +
   }
  
  
  
  1.4       +8 -1      
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/functions/impl/SubStringFunction.java
  
  Index: SubStringFunction.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/functions/impl/SubStringFunction.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SubStringFunction.java    2001/12/01 10:49:44     1.3
  +++ SubStringFunction.java    2001/12/18 23:34:33     1.4
  @@ -15,7 +15,7 @@
    * Class SubStringFunction
    *
    * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
  - * @version $Revision: 1.3 $
  + * @version $Revision: 1.4 $
    */
   public class SubStringFunction extends AbstractStringFunction {
   
  @@ -40,6 +40,13 @@
   
       public int getMaxLength() {
           return mLen;
  +    }
  +
  +    public int getMinCols() {
  +        return 1;
  +    }
  +    public int getMaxCols() {
  +        return 1;
       }
   
   }
  
  
  
  1.4       +8 -1      
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/functions/impl/TrimStringFunction.java
  
  Index: TrimStringFunction.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/functions/impl/TrimStringFunction.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TrimStringFunction.java   2001/12/01 10:49:44     1.3
  +++ TrimStringFunction.java   2001/12/18 23:34:33     1.4
  @@ -17,7 +17,7 @@
    * Class TrimStringFunction
    *
    * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
  - * @version $Revision: 1.3 $
  + * @version $Revision: 1.4 $
    */
   public class TrimStringFunction extends AbstractStringFunction {
   
  @@ -28,6 +28,13 @@
       public int getMaxLength() {
           StringColumn sTyp = (StringColumn) mColumns[0];
           return sTyp.getMaxLength();
  +    }
  +
  +    public int getMinCols() {
  +        return 1;
  +    }
  +    public int getMaxCols() {
  +        return 1;
       }
   
   }
  
  
  
  1.5       +8 -1      
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/functions/impl/UpperCaseStringFunction.java
  
  Index: UpperCaseStringFunction.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/functions/impl/UpperCaseStringFunction.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- UpperCaseStringFunction.java      2001/12/18 14:24:53     1.4
  +++ UpperCaseStringFunction.java      2001/12/18 23:34:33     1.5
  @@ -17,7 +17,7 @@
    * Class UpperCaseStringFunction
    *
    * @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
  - * @version $Revision: 1.4 $
  + * @version $Revision: 1.5 $
    */
   public class UpperCaseStringFunction extends AbstractStringFunction {
   
  @@ -38,6 +38,13 @@
       public int getMaxLength() {
           StringColumn sTyp = (StringColumn) mColumns[0];
           return sTyp.getMaxLength();
  +    }
  +
  +    public int getMinCols() {
  +        return 1;
  +    }
  +    public int getMaxCols() {
  +        return 1;
       }
   
   }
  
  
  
  1.5       +29 -0     
jakarta-avalon-cornerstone/apps/db/src/scripts/lxsql/Test2.script
  
  Index: Test2.script
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/scripts/lxsql/Test2.script,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Test2.script      2001/12/18 20:21:26     1.4
  +++ Test2.script      2001/12/18 23:34:33     1.5
  @@ -79,5 +79,34 @@
      </from>
   </simple-select>
   
  +### UPDATE 1 ( funky update ) ##!
  +
  +<update-rows from="Flintstones">
  +  <updates>
  +    <set name="surname">
  +      <concat>
  +        <const value="O`"/>
  +        <column name="surname"/>
  +      </concat>
  +    </set>
  +  </updates>
  +  <where>
  +    <condition expr="age>60"/>
  +  </where>
  +</update-rows>
  +
  +### SELECT 4 (all rows) ##!
  +
  +<simple-select>
  +   <columns>
  +    <column name="forename"/>
  +    <column name="surname"/>
  +    <column name="age"/>
  +   </columns>
  +   <from>
  +     <table name="Flintstones"/>
  +   </from>
  +</simple-select>
  +
   
   ###
  
  
  

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

Reply via email to