You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by ha...@apache.org on 2001/11/29 09:46:26 UTC

cvs commit: jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/handlers/lxsql BasicLXSQLCreateAggregateViewHandler.java BasicLXSQLCreateViewHandler.java BasicLXSQLSelectSimpleHandler.java

hammant     01/11/29 00:46:26

  Modified:    apps/db/src/java/org/apache/avalon/db/basic/data
                        BasicAggregateView.java BasicView.java
               apps/db/src/java/org/apache/avalon/db/basic/handlers/lxsql
                        BasicLXSQLCreateAggregateViewHandler.java
                        BasicLXSQLCreateViewHandler.java
                        BasicLXSQLSelectSimpleHandler.java
  Added:       apps/db/src/java/org/apache/avalon/db/basic/actions
                        BasicSelectSimple.java
  Removed:     apps/db/src/java/org/apache/avalon/db/basic/actions
                        BasicSelect.java
  Log:
  Migration of XML logic to handler from BasicSelect (also renamed)
  
  Revision  Changes    Path
  1.1                  jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicSelectSimple.java
  
  Index: BasicSelectSimple.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.impl.AbstractAction;
  import org.apache.avalon.db.actions.Select;
  import org.apache.avalon.db.actions.ParameterAdaptable;
  import org.apache.avalon.db.actions.ActionException;
  import org.apache.avalon.db.results.RowSet;
  import org.apache.avalon.db.results.Columns;
  import org.apache.avalon.db.basic.data.BasicTable;
  import org.apache.avalon.db.basic.data.BasicRow;
  import org.apache.avalon.db.basic.results.BasicRowSet;
  import org.apache.avalon.db.basic.results.BasicColumns;
  import org.apache.avalon.db.data.Column;
  import org.apache.avalon.db.data.impl.AbstractQueryable;
  import org.apache.avalon.framework.logger.LogEnabled;
  
  import java.util.Vector;
  import java.util.Iterator;
  
  /**
   * This class represents the BasicSelectSimple
   * @author Gerhard Froehlich <a href="mailto:g-froehlich@gmx.de">g-froehlich@gmx.de</a>
   * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
   *
   * @version $Revision: 1.1 $
   */
  public class BasicSelectSimple extends AbstractAction implements Select,ParameterAdaptable,LogEnabled {
  
      private RowSet mRowSet;
      private Columns mColumns;
      private boolean mPrepared;
      private boolean mWithParams;
      private int mParamCount;
      private AbstractQueryable mQueryable;
      private Column[] mCols;
      private String[] mTablenames;
      private SimpleWhereClause mSimpleWhereClause;
  
      public BasicSelectSimple(String[] tableNames, Column[] columns, SimpleWhereClause whereClause) {
          mTablenames = tableNames;
          mCols = columns;
          mSimpleWhereClause = whereClause;
      }
  
      public void initialize() throws ActionException {
          getLogger().debug("BasicSelectSimple.initialize()");
          getLogger().debug("cols.length=" + mCols.length);
          getLogger().debug("tablenames.length=" + mTablenames.length);
      }
  
      /**
       * The execute method for this action
       */
      public void execute() throws ActionException {
          StringBuffer strbuf = new StringBuffer();
          Vector selectedRows = new Vector();
          Object[] selectedRow = null;
          selectedRows = new Vector();
  
          for(int i=0; i < mTablenames.length; i++) {
              /** get the table, should be only one */
              mQueryable = (AbstractQueryable) mDatabasePersistor.getQueryable(mTablenames[i]);
              Iterator it = mQueryable.getRows().iterator();
              while(it.hasNext()) {
                  /** iterate rows and select only the needed cols */
                  BasicRow row = (BasicRow)it.next();
                  if (mSimpleWhereClause.testActionRow(row)) {
                      getLogger().debug("specific select=" + mCols);
                      selectedRow = new Object[mCols.length];
                      for (int j=0; j < mCols.length; j++) {
                          getLogger().debug("mCols[" + j + "]=" + mCols[j]);
                          Object o = mCols[j].getValue(row);
                          getLogger().debug("row.getValue(mCols[" + j + "]=" + o);
                          selectedRow[j] = o;
                      }
                      selectedRows.add(selectedRow);
                  }
              }
              getLogger().debug("selectedRows.size()=" + selectedRows.size());
              mColumns = new BasicColumns();
              mRowSet = new BasicRowSet(mColumns,selectedRows);
          }
      }
  
      public void execute(Object[] params) throws ActionException {
          getLogger().debug("select execute prepared");
      }
  
      public void setPrepared(boolean b) {
          mPrepared = b;
      }
  
      public boolean getPrepared() {
          return mPrepared;
      }
  
      public void setWithParams(boolean b) {
          mWithParams = b;
      }
  
      public boolean getWithParams() {
          return mWithParams;
      }
  
      public RowSet getRowSet() {
          return mRowSet;
      }
  
      public int getParamCount() {
          return this.mParamCount;
      }
  
      public void setParamCount(int i) {
          this.mParamCount = i;
      }
  }
  
  
  
  1.2       +2 -2      jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/data/BasicAggregateView.java
  
  Index: BasicAggregateView.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/data/BasicAggregateView.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BasicAggregateView.java	2001/11/24 20:26:12	1.1
  +++ BasicAggregateView.java	2001/11/29 08:46:26	1.2
  @@ -14,7 +14,7 @@
   import org.apache.avalon.db.data.RowListener;
   import org.apache.avalon.db.data.Row;
   import org.apache.avalon.db.data.DataException;
  -import org.apache.avalon.db.basic.actions.BasicSelect;
  +import org.apache.avalon.db.basic.actions.BasicSelectSimple;
   import org.apache.avalon.db.basic.actions.SimpleWhereClause;
   import org.apache.avalon.db.basic.actions.SimpleWhereClauseMatchingRowCallback;
   
  @@ -26,7 +26,7 @@
    *
    *
    * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
  - * @version $Revision: 1.1 $
  + * @version $Revision: 1.2 $
    */
   public class BasicAggregateView extends AbstractAggregateView {
   
  
  
  
  1.8       +2 -2      jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/data/BasicView.java
  
  Index: BasicView.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/data/BasicView.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- BasicView.java	2001/11/24 18:37:01	1.7
  +++ BasicView.java	2001/11/29 08:46:26	1.8
  @@ -13,7 +13,7 @@
   import org.apache.avalon.db.data.RowListener;
   import org.apache.avalon.db.data.Row;
   import org.apache.avalon.db.data.DataException;
  -import org.apache.avalon.db.basic.actions.BasicSelect;
  +import org.apache.avalon.db.basic.actions.BasicSelectSimple;
   import org.apache.avalon.db.basic.actions.SimpleWhereClause;
   import org.apache.avalon.db.basic.actions.SimpleWhereClauseMatchingRowCallback;
   
  @@ -25,7 +25,7 @@
    *
    *
    * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
  - * @version $Revision: 1.7 $
  + * @version $Revision: 1.8 $
    */
   public class BasicView extends AbstractView {
   
  
  
  
  1.3       +2 -2      jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/handlers/lxsql/BasicLXSQLCreateAggregateViewHandler.java
  
  Index: BasicLXSQLCreateAggregateViewHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/handlers/lxsql/BasicLXSQLCreateAggregateViewHandler.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- BasicLXSQLCreateAggregateViewHandler.java	2001/11/27 21:18:22	1.2
  +++ BasicLXSQLCreateAggregateViewHandler.java	2001/11/29 08:46:26	1.3
  @@ -12,7 +12,7 @@
   
   import org.apache.avalon.db.basic.parser.BasicLXSQLParser;
   import org.apache.avalon.db.basic.actions.SimpleWhereClause;
  -import org.apache.avalon.db.basic.actions.BasicSelect;
  +import org.apache.avalon.db.basic.actions.BasicSelectSimple;
   import org.apache.avalon.db.basic.actions.BasicCreateAggregateView;
   import org.apache.avalon.db.services.DatabasePersistor;
   import org.apache.avalon.db.transport.Reply;
  @@ -34,7 +34,7 @@
    *
    *
    * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
  - * @version $Revision: 1.2 $
  + * @version $Revision: 1.3 $
    */
   public class BasicLXSQLCreateAggregateViewHandler extends BasicLXSQLAggregateHandler {
   
  
  
  
  1.8       +2 -2      jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/handlers/lxsql/BasicLXSQLCreateViewHandler.java
  
  Index: BasicLXSQLCreateViewHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/handlers/lxsql/BasicLXSQLCreateViewHandler.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- BasicLXSQLCreateViewHandler.java	2001/11/23 12:40:20	1.7
  +++ BasicLXSQLCreateViewHandler.java	2001/11/29 08:46:26	1.8
  @@ -13,7 +13,7 @@
   import org.apache.avalon.db.basic.parser.BasicLXSQLParser;
   import org.apache.avalon.db.basic.actions.BasicCreateView;
   import org.apache.avalon.db.basic.actions.SimpleWhereClause;
  -import org.apache.avalon.db.basic.actions.BasicSelect;
  +import org.apache.avalon.db.basic.actions.BasicSelectSimple;
   import org.apache.avalon.db.services.DatabasePersistor;
   import org.apache.avalon.db.transport.Reply;
   import org.apache.avalon.db.transport.Request;
  @@ -34,7 +34,7 @@
    *
    *
    * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
  - * @version $Revision: 1.7 $
  + * @version $Revision: 1.8 $
    */
   public class BasicLXSQLCreateViewHandler extends BasicLXSQLQueryableHandler {
   
  
  
  
  1.4       +84 -3     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.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- BasicLXSQLSelectSimpleHandler.java	2001/11/19 09:03:02	1.3
  +++ BasicLXSQLSelectSimpleHandler.java	2001/11/29 08:46:26	1.4
  @@ -11,7 +11,8 @@
   
   
   import org.apache.avalon.db.basic.parser.BasicLXSQLParser;
  -import org.apache.avalon.db.basic.actions.BasicSelect;
  +import org.apache.avalon.db.basic.actions.BasicSelectSimple;
  +import org.apache.avalon.db.basic.actions.SimpleWhereClause;
   import org.apache.avalon.db.services.DatabasePersistor;
   import org.apache.avalon.db.transport.Reply;
   import org.apache.avalon.db.transport.Request;
  @@ -20,9 +21,13 @@
   import org.apache.avalon.db.actions.ActionException;
   import org.apache.avalon.db.actions.Select;
   import org.apache.avalon.db.server.DBRequestContext;
  +import org.apache.avalon.db.data.Column;
  +import org.apache.avalon.db.data.Queryable;
  +import org.apache.avalon.db.data.impl.AbstractQueryable;
   
   import org.w3c.dom.Document;
   import org.w3c.dom.Element;
  +import org.w3c.dom.NodeList;
   
   
   /**
  @@ -30,7 +35,7 @@
    *
    *
    * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
  - * @version $Revision: 1.3 $
  + * @version $Revision: 1.4 $
    */
   public class BasicLXSQLSelectSimpleHandler extends BasicLXSQLHandler {
   
  @@ -63,11 +68,87 @@
           SelectRequest cvr = (SelectRequest) request;
           Document doc = mParser.parseLXSQLString(cvr.getSql());
           Element rootElement = doc.getDocumentElement();
  -        Select action = new BasicSelect(rootElement);
   
  +        String[] tables = parseFrom(rootElement);
  +
  +        AbstractQueryable queryable = (AbstractQueryable) mDatabasePersistor.getQueryable(tables[0]);
  +
  +        Select action = new BasicSelectSimple(tables,
  +        convertColumns(queryable, getColumns(rootElement)),
  +        new SimpleWhereClause(rootElement));
  +
           mParser.initializeAction(action);
           action.execute();
   
           return new ResultSetReply(action.getRowSet());
       }
  +
  +
  +    private String[] parseFrom(Element rootElement) {
  +        NodeList subRootNodes = rootElement.getChildNodes();
  +        String[] tablenames = null;
  +
  +        for (int i=0; i < subRootNodes.getLength(); i++) {
  +            if(subRootNodes.item(i).getNodeName().equals("from")) {
  +                NodeList subFromNodes = subRootNodes.item(i).getChildNodes();
  +                tablenames = new String[subFromNodes.getLength()];
  +                for(int j=0; j < subFromNodes.getLength(); j++) {
  +                    Element fromElement = (Element)subFromNodes.item(j);
  +                    tablenames[j] = fromElement.getAttribute("name");
  +                }
  +            }
  +        }
  +        return tablenames;
  +    }
  +
  +    protected Column[] convertColumns(AbstractQueryable queryable, String[] columnNames) {
  +
  +        //TODO * could be with other contrived columns
  +        if (columnNames[0].equals("*")) {
  +            return queryable.getColumns();
  +        }
  +
  +        Column[] columns = new Column[columnNames.length];
  +        for ( int i = 0; i < columnNames.length; i++ ) {
  +            columns[i] = queryable.getColumn(columnNames[i], false);
  +        }
  +        return columns;
  +    }
  +
  +    private String[] getColumns(Element rootElement) throws ActionException {
  +        NodeList subRootNodes = rootElement.getChildNodes();
  +        String[] cols = null;
  +
  +        for (int i=0; i < subRootNodes.getLength(); i++) {
  +            if(subRootNodes.item(i).getNodeName().equals("columns")) {
  +                Element columnsElement = (Element)subRootNodes.item(i);
  +                getLogger().debug("columnsElement.getFirstChild()=" + columnsElement.getFirstChild().getNodeName());
  +                //First test if *
  +                if(columnsElement.getFirstChild().getNodeName().equals("#text")) {
  +                   if(columnsElement.getFirstChild().getNodeValue().equals("*")) {
  +                       cols = new String[1];
  +                       cols[0] = "*";
  +                   } else {
  +                       throw new ActionException(columnsElement.getFirstChild().getNodeValue()
  +                                              + " is not valid LXSQL Syntax");
  +                   }
  +                } else if (subRootNodes.item(i).hasChildNodes()) {
  +                    NodeList subColumnsNodes = subRootNodes.item(i).getChildNodes();
  +                    cols = new String[subColumnsNodes.getLength()];
  +                    for (int j=0; j < subColumnsNodes.getLength(); j++) {
  +                        //TODO checking columns, function...maybe extern syntax checking!?
  +                        Element columnElement = (Element)subColumnsNodes.item(j);
  +                        cols[j] = columnElement.getAttribute("name");
  +                    }
  +                } else {
  +                    throw new ActionException(columnsElement.getFirstChild().getNodeValue()
  +                                              + " is not valid LXSQL Syntax");
  +                }
  +            }
  +        }
  +        return cols;
  +    }
  +
  +
  +
   }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>