[prev in list] [next in list] [prev in thread] [next in thread] 

List:       jaxme-dev
Subject:    cvs commit: ws-jaxme/src/js/org/apache/ws/jaxme/sqls InsertStatement.java
From:       jochen () apache ! org
Date:       2004-06-25 9:14:38
Message-ID: 20040625091438.89718.qmail () minotaur ! apache ! org
[Download RAW message or body]

jochen      2004/06/25 02:14:38

  Modified:    src/js/org/apache/ws/jaxme/sqls/impl
                        InsertStatementImpl.java SQLGeneratorImpl.java
               src/js/org/apache/ws/jaxme/sqls/junit CreateTest.java
               src/js/org/apache/ws/jaxme/sqls/oracle
                        OraSQLGeneratorImpl.java
                        OraSelectStatementMetaData.java
               src/js/org/apache/ws/jaxme/sqls InsertStatement.java
  Added:       src/js/org/apache/ws/jaxme/sqls/impl StatementMetaData.java
  Removed:     src/js/org/apache/ws/jaxme/sqls/impl
                        SelectStatementMetaData.java
  Log:
  Added support for bulk inserts.
  
  Revision  Changes    Path
  1.3       +13 -2     \
ws-jaxme/src/js/org/apache/ws/jaxme/sqls/impl/InsertStatementImpl.java  
  Index: InsertStatementImpl.java
  ===================================================================
  RCS file: /home/cvs/ws-jaxme/src/js/org/apache/ws/jaxme/sqls/impl/InsertStatementImpl.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- InsertStatementImpl.java	16 Feb 2004 23:39:49 -0000	1.2
  +++ InsertStatementImpl.java	25 Jun 2004 09:14:38 -0000	1.3
  @@ -18,15 +18,26 @@
   
   import org.apache.ws.jaxme.sqls.InsertStatement;
   import org.apache.ws.jaxme.sqls.SQLFactory;
  +import org.apache.ws.jaxme.sqls.SelectStatement;
   
   
   /**
    * @author <a href="mailto:joe@ispsoft.de">Jochen Wiedmann</a>
    */
   public class InsertStatementImpl extends SetStatementImpl implements \
                InsertStatement {
  -  /** <p>Creates a new instance of InsertStatementImpl.</p>
  -   */
  +	private SelectStatement st;
  +
  +    /** <p>Creates a new instance of InsertStatementImpl.</p>
  +	 */
   	InsertStatementImpl(SQLFactory pFactory) {
   		super(pFactory);
  +	}
  +
  +	public void setSubSelect(SelectStatement pStatement) {
  +        st = pStatement;
  +	}
  +
  +	public SelectStatement getSubSelect() {
  +        return st;
   	}
   }
  
  
  
  1.20      +101 -48   \
ws-jaxme/src/js/org/apache/ws/jaxme/sqls/impl/SQLGeneratorImpl.java  
  Index: SQLGeneratorImpl.java
  ===================================================================
  RCS file: /home/cvs/ws-jaxme/src/js/org/apache/ws/jaxme/sqls/impl/SQLGeneratorImpl.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- SQLGeneratorImpl.java	17 Jun 2004 09:57:01 -0000	1.19
  +++ SQLGeneratorImpl.java	25 Jun 2004 09:14:38 -0000	1.20
  @@ -354,37 +354,90 @@
           result.add(newStatement("DROP TABLE " + pTable.getQName()));
           return result;
       }
  -    
  +
  +    private ColumnReference[] getInsertStatementsColumns(InsertStatement \
pStatement) {  +        List result = new ArrayList();
  +        for (Iterator iter = pStatement.getSetValues();  iter.hasNext();  ) {
  +            SetStatement.SetValue setValue = (SetStatement.SetValue) iter.next();
  +            result.add(setValue.getColumnReference());
  +        }
  +        SelectStatement subSelect = pStatement.getSubSelect();
  +        if (subSelect != null) {
  +        	for (Iterator iter = subSelect.getResultColumns();  iter.hasNext();  ) {
  +        		ColumnReference cRef = (ColumnReference) iter.next();
  +        		Column.Name name;
  +        		if (cRef.getAlias() == null) {
  +                    name = cRef.getColumn().getName();
  +        		} else {
  +                    name = cRef.getAlias();
  +        		}
  +        		Column col = pStatement.getTableReference().getTable().getColumn(name);
  +        		if (col == null) {
  +        			throw new IllegalStateException("A result column " + name
  +        					+ " is used in the subselect, which is not present in the insert \
statements table.");  +        		}
  +        		result.add(pStatement.getTableReference().newColumnReference(col));
  +        	}
  +        }
  +        return (ColumnReference[]) result.toArray(new \
ColumnReference[result.size()]);  +    }
  +
  +    private void addSetValuesToInsertStatement(StringBuffer pBuffer,
  +                                               StatementMetaData pData,
  +                                               InsertStatement pQuery) {
  +        pBuffer.append(" VALUES (");
  +        boolean first = true;
  +        for (Iterator iter = pQuery.getSetValues();  iter.hasNext();  ) {
  +        	if (first) {
  +        		first = false;
  +        	} else {
  +        		pBuffer.append(", ");
  +        	}
  +        	SetStatement.SetValue setValue = (SetStatement.SetValue) iter.next();
  +        	pBuffer.append(getValue(setValue.getValue()));
  +        }
  +        pBuffer.append(")");
  +    }
  +
  +    private void addSubSelectToInsertStatement(StringBuffer pBuffer, \
StatementMetaData pData,  +                                               \
InsertStatement pStatement) {  +        pBuffer.append(" (");
  +        pBuffer.append(getSelectQuery(pStatement.getSubSelect(), pData));
  +        pBuffer.append(")");
  +    }
  +
       public String getInsertQuery(InsertStatement pQuery) {
  +        ColumnReference[] columns = getInsertStatementsColumns(pQuery);
  +        StatementMetaData smd = new StatementMetaData(pQuery, columns);
  +        
           StringBuffer result = new StringBuffer();
           result.append("INSERT INTO ");
  -        result.append(getTableAlias(null, pQuery.getTableReference()));
  -        boolean first = true;
  -        for (Iterator iter = pQuery.getSetValues();  iter.hasNext();  ) {
  -            if (first) {
  -                result.append(" (");
  -                first = false;
  -            } else {
  -                result.append(", ");
  +        result.append(getTableAlias(smd, pQuery.getTableReference()));
  +        if (columns.length > 0) {
  +            result.append(" (");
  +            for (int i = 0;  i < columns.length;  i++) {
  +            	if (i > 0) {
  +            		result.append(", ");
  +                }
  +                result.append(getColumnAlias(smd, columns[i]));
               }
  -            SetStatement.SetValue setValue = (SetStatement.SetValue) iter.next();
  -            result.append(getColumnAlias(null, setValue.getColumnReference()));
  -        }
  -        if (!first) {
               result.append(")");
           }
  -        result.append(" VALUES (");
  -        first = true;
  -        for (Iterator iter = pQuery.getSetValues();  iter.hasNext();  ) {
  -            if (first) {
  -                first = false;
  +        boolean hasSetValues = pQuery.getSetValues().hasNext();
  +        boolean hasSubselect = pQuery.getSubSelect() != null;
  +        if (hasSetValues) {
  +            if (hasSubselect) {
  +            	throw new IllegalStateException("Using values \
(InsertStatement.addFoo(..)) and subselects (InsertStatement.setSubSelect(...)) is \
mutually exclusive.");  } else {
  -                result.append(", ");
  +                addSetValuesToInsertStatement(result, smd, pQuery);
  +            }
  +        } else {
  +            if (hasSubselect) {
  +                addSubSelectToInsertStatement(result, smd, pQuery);
  +            } else {
  +            	throw new IllegalStateException("Neither values \
(InsertStatement.addFoo(..)) nor a subselect (InsertStatement.setSubSelect(...)) are \
set.");  }
  -            SetStatement.SetValue setValue = (SetStatement.SetValue) iter.next();
  -            result.append(getValue(setValue.getValue()));
           }
  -        result.append(")");
           return newStatement(result.toString());
       }
       
  @@ -452,7 +505,7 @@
           return result.toString();
       }
       
  -    protected boolean isQualifiedColumn(SelectStatementMetaData pData, \
ColumnReference pColumn) {  +    protected boolean \
isQualifiedColumn(StatementMetaData pData, ColumnReference pColumn) {  if (pData == \
null) {  return false;
           }
  @@ -464,11 +517,11 @@
           return num.intValue() > 1;
       }
       
  -    protected String getFunction(SelectStatementMetaData pData, Function f) {
  +    protected String getFunction(StatementMetaData pData, Function f) {
           return f.getName() + '(' + getParts(pData, f.getParts()) + ')';
       }
       
  -    protected String getColumnAlias(SelectStatementMetaData pData, ColumnReference \
pColumn) {  +    protected String getColumnAlias(StatementMetaData pData, \
ColumnReference pColumn) {  Column col = pColumn.getColumn();
           String s = col.getName().toString();
           if (col.isVirtual()) {
  @@ -500,7 +553,7 @@
           return s;
       }
       
  -    protected String getColumnAlias(SelectStatementMetaData pData, \
ColumnReference[] pColumn) {  +    protected String getColumnAlias(StatementMetaData \
pData, ColumnReference[] pColumn) {  StringBuffer sb = new StringBuffer("(");
           for (int i = 0;  i < pColumn.length;  i++) {
               if (i > 0) sb.append(", ");
  @@ -512,7 +565,7 @@
       
       protected boolean isTableAliasUsingAs() { return true; }
       
  -    protected String getTableAlias(SelectStatementMetaData pData, TableReference \
pTable) {  +    protected String getTableAlias(StatementMetaData pData, \
TableReference pTable) {  Table t = pTable.getTable();
           String tableName;
           Table.Name alias = pTable.getAlias();
  @@ -533,7 +586,7 @@
           }
       }
       
  -    protected String getJoinAlias(SelectStatementMetaData pData, JoinReference \
pJoinReference) {  +    protected String getJoinAlias(StatementMetaData pData, \
JoinReference pJoinReference) {  StringBuffer result = new StringBuffer();
           if (pJoinReference.isLeftOuterJoin()) {
               result.append(" LEFT OUTER JOIN ");
  @@ -561,7 +614,7 @@
           return "'" + s + "'";
       }
       
  -    protected String getParts(SelectStatementMetaData pData, Iterator pParts) {
  +    protected String getParts(StatementMetaData pData, Iterator pParts) {
           StringBuffer sb = new StringBuffer();
           while (pParts.hasNext()) {
               if (sb.length() > 0) {
  @@ -572,7 +625,7 @@
           return sb.toString();
       }
       
  -    protected String getBooleanConstraintPart(SelectStatementMetaData pData, \
Object o) {  +    protected String getBooleanConstraintPart(StatementMetaData pData, \
Object o) {  if (o instanceof Value) {
               return getValue((Value) o);
           } else if (o instanceof ColumnReference) {
  @@ -610,7 +663,7 @@
           }
       }
       
  -    protected String getBooleanConstraint(SelectStatementMetaData pData,
  +    protected String getBooleanConstraint(StatementMetaData pData,
               BooleanConstraint pConstraint) {
           BooleanConstraint.Type type = pConstraint.getType();
           Iterator parts = pConstraint.getParts();
  @@ -660,7 +713,7 @@
           return result.toString();
       }
       
  -    protected String getCombinedConstraint(SelectStatementMetaData pData,
  +    protected String getCombinedConstraint(StatementMetaData pData,
               CombinedConstraint pConstraint) {
           if (pConstraint.getNumParts() == 0) {
               return null;
  @@ -716,7 +769,7 @@
           }
       }
       
  -    public String getConstraint(SelectStatementMetaData pData, Constraint \
pConstraint) {  +    public String getConstraint(StatementMetaData pData, Constraint \
pConstraint) {  if (pConstraint instanceof CombinedConstraint) {
               return getWhereClause(pData, (CombinedConstraint) pConstraint);
           } else if (pConstraint instanceof BooleanConstraint) {
  @@ -727,18 +780,18 @@
           }
       }
       
  -    protected String getWhereClause(SelectStatementMetaData pData,
  +    protected String getWhereClause(StatementMetaData pData,
               CombinedConstraint pWhereClause) {
           return getCombinedConstraint(pData, pWhereClause);
       }
       
       protected String getSelectQuery(SelectStatement pQuery) {
  -        SelectStatementMetaData selectStatementMetaData = \
newSelectStatementMetaData(pQuery);  +        StatementMetaData \
selectStatementMetaData = newSelectStatementMetaData(pQuery);  return \
getSelectQuery(pQuery, selectStatementMetaData);  }
       
   
  -    protected String getSelectQueryResultColumns(SelectStatement pQuery, \
SelectStatementMetaData pData) {  +    protected String \
getSelectQueryResultColumns(SelectStatement pQuery, StatementMetaData pData) {  \
StringBuffer sb = new StringBuffer();  if (pQuery.isDistinct()) {
               sb.append(" DISTINCT");
  @@ -762,7 +815,7 @@
           return sb.toString();
       }
   
  -    protected String getSelectQueryFromClause(SelectStatement pQuery, \
SelectStatementMetaData pData) {  +    protected String \
                getSelectQueryFromClause(SelectStatement pQuery, StatementMetaData \
                pData) {
           SelectTableReference selectTableReference = \
pQuery.getSelectTableReference();  if (selectTableReference == null) {
               return null;
  @@ -778,8 +831,8 @@
           return sb.toString();
       }
   
  -    protected String getSelectQueryConstraints(SelectStatement pQuery, \
                SelectStatementMetaData pData,
  -                                               SelectStatementMetaData.LocalData \
pLocalData) {  +    protected String getSelectQueryConstraints(SelectStatement \
pQuery, StatementMetaData pData,  +                                               \
StatementMetaData.LocalData pLocalData) {  String s = getWhereClause(pData, \
pQuery.getWhere());  if (pLocalData != null  &&  s != null  &&  s.length() > 0) {
           	pLocalData.setWhereClause(true);
  @@ -787,7 +840,7 @@
           return s;
       }
   
  -    protected String getSelectQuery(SelectStatement pQuery, \
SelectStatementMetaData pData) {  +    protected String \
getSelectQuery(SelectStatement pQuery, StatementMetaData pData) {  StringBuffer sb = \
new StringBuffer("SELECT");  String s = getSelectQueryResultColumns(pQuery, pData);
           if (s != null) {
  @@ -799,7 +852,7 @@
               sb.append(s);
           }
   
  -        SelectStatementMetaData.LocalData localData = new \
SelectStatementMetaData.LocalData();  +        StatementMetaData.LocalData localData \
= new StatementMetaData.LocalData();  s = getSelectQueryConstraints(pQuery, pData, \
localData);  if (s != null  &&  s.length() > 0) {
               if (localData.hasWhereClause()) {
  @@ -815,7 +868,7 @@
           return sb.toString();
       }
       
  -    protected String getSelectQueryOrderClause(SelectStatementMetaData pData, \
SelectStatement pQuery) {  +    protected String \
getSelectQueryOrderClause(StatementMetaData pData, SelectStatement pQuery) {  \
                StringBuffer sb = new StringBuffer();
           for (Iterator iter = pQuery.getOrderColumns();  iter.hasNext();  ) {
               SelectStatement.OrderColumn col = (SelectStatement.OrderColumn) \
iter.next();  @@ -965,15 +1018,15 @@
           return Collections.EMPTY_SET;
       }
       
  -    protected SelectStatementMetaData newSelectStatementMetaData(SelectStatement \
                pQuery) {
  -        return new SelectStatementMetaData(pQuery);
  +    protected StatementMetaData newSelectStatementMetaData(SelectStatement pQuery) \
{  +        return new StatementMetaData(pQuery);
       }
   
       public String getWhereClause(SelectStatement pQuery) {
  -        SelectStatementMetaData metaData = newSelectStatementMetaData(pQuery);
  +        StatementMetaData metaData = newSelectStatementMetaData(pQuery);
           StringBuffer sb = new StringBuffer();
   
  -        SelectStatementMetaData.LocalData localData = new \
SelectStatementMetaData.LocalData();  +        StatementMetaData.LocalData localData \
                = new StatementMetaData.LocalData();
           String s = getSelectQueryConstraints(pQuery, metaData, localData);
           if (s != null) {
               sb.append(s);
  @@ -992,7 +1045,7 @@
               CombinedConstraint cc = (CombinedConstraint) pConstraint;
               Statement st = cc.getConstrainedStatement();
               if (st instanceof SelectStatement) {
  -                SelectStatementMetaData selectStatementMetaData = \
newSelectStatementMetaData((SelectStatement) st);  +                StatementMetaData \
                selectStatementMetaData = \
                newSelectStatementMetaData((SelectStatement) st);
                   return getCombinedConstraint(selectStatementMetaData, cc);
               } else {
                   return getCombinedConstraint(null, cc);
  @@ -1001,7 +1054,7 @@
               BooleanConstraint bc = (BooleanConstraint) pConstraint;
               Statement st = bc.getConstrainedStatement();
               if (st instanceof SelectStatement) {
  -                SelectStatementMetaData selectStatementMetaData = \
newSelectStatementMetaData((SelectStatement) st);  +                StatementMetaData \
                selectStatementMetaData = \
                newSelectStatementMetaData((SelectStatement) st);
                   return getBooleanConstraint(selectStatementMetaData, bc);
               } else {
                   return getBooleanConstraint(null, bc);
  
  
  
  1.1                  \
ws-jaxme/src/js/org/apache/ws/jaxme/sqls/impl/StatementMetaData.java  
  Index: StatementMetaData.java
  ===================================================================
  /*
   * Copyright 2003, 2004  The Apache Software Foundation
   * 
   * Licensed 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.apache.ws.jaxme.sqls.impl;
  
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.List;
  import java.util.Map;
  
  import org.apache.ws.jaxme.sqls.BooleanConstraint;
  import org.apache.ws.jaxme.sqls.Column;
  import org.apache.ws.jaxme.sqls.ColumnReference;
  import org.apache.ws.jaxme.sqls.CombinedConstraint;
  import org.apache.ws.jaxme.sqls.Function;
  import org.apache.ws.jaxme.sqls.InsertStatement;
  import org.apache.ws.jaxme.sqls.JoinReference;
  import org.apache.ws.jaxme.sqls.Parts;
  import org.apache.ws.jaxme.sqls.RawSQLCode;
  import org.apache.ws.jaxme.sqls.SelectStatement;
  import org.apache.ws.jaxme.sqls.SetStatement;
  import org.apache.ws.jaxme.sqls.Table;
  import org.apache.ws.jaxme.sqls.TableReference;
  import org.apache.ws.jaxme.sqls.Value;
  
  
  public class StatementMetaData {
      public static class LocalData {
          private boolean hasWhereClause;
          
          public boolean hasWhereClause() {
              return hasWhereClause;
          }
  
          public void setWhereClause(boolean pHasWhereClause) {
              hasWhereClause = pHasWhereClause;
          }
      }
  
      private final Map aliases = new HashMap();
      private final Map columnNames = new HashMap();
  
      private final List tables = new ArrayList();
  
      public StatementMetaData(InsertStatement pQuery, ColumnReference[] pColumns) {
      	addSetStatement(pQuery, pColumns);
          SelectStatement subSelect = pQuery.getSubSelect();
          if (subSelect != null) {
          	addSelectStatement(subSelect);
          }
      }
  
      public StatementMetaData(SelectStatement pQuery) {
        addSelectStatement(pQuery);
        createTableAliases();
        createColumnNames();
      }
  
      protected void addSetStatement(SetStatement pQuery, ColumnReference[] pColumns) \
{  addTable(pQuery.getTableReference());
          for (int i = 0;  i < pColumns.length;  i++) {
              addColumn(pColumns[i], false);
          }
          for (Iterator iter = pQuery.getSetValues();  iter.hasNext();  ) {
          	addPart(((SetStatement.SetValue) iter.next()).getValue());
          }
      }
  
      protected void addTable(TableReference pTableReference) {
          Table t = pTableReference.getTable();
          Table.Name alias = pTableReference.getAlias();
          if (alias != null) {
              if (aliases.containsKey(alias.getName())) {
                  throw new IllegalStateException("The alias " + alias +
                          " is used twice ");
              }
              aliases.put(alias.getName(), pTableReference);
          }
          tables.add(pTableReference);
          if (t instanceof ViewImpl) {
              ViewImpl v = (ViewImpl) t;
              addSelectStatement(v.getViewStatement());
          }
              
          if (pTableReference instanceof JoinReference) {
              addCombinedConstraint(((JoinReference) pTableReference).getOn());
          }
      }
  
      protected void addSelectStatement(SelectStatement pQuery) {
          for (Iterator tableIter = pQuery.getSelectTableReferences();  \
tableIter.hasNext();  ) {  addTable((TableReference) tableIter.next());
          }
          addCombinedConstraint(pQuery.getWhere());
          for (Iterator iter = pQuery.getResultColumns();  iter.hasNext();  ) {
              addColumn((ColumnReference) iter.next(), true);
          }
      }
  
      protected void addColumn(ColumnReference pColumn, boolean pIgnoreTrueRefs) {
          if (pColumn instanceof VirtualColumn) {
              VirtualColumn vc = (VirtualColumn) pColumn;
              Object o = vc.getValue();
              if (o instanceof SelectStatement) {
                  addSelectStatement((SelectStatement) o);
              } else if (o instanceof Function) {
                  addParts((Function) o);
              } else if (o instanceof String) {
                  // Do nothing
              } else {
                  throw new IllegalStateException("Invalid type of VirtualColumn: " + \
o);  }
              addColumnName(vc.getName());
          } else if (!pIgnoreTrueRefs) {
          	Column.Name alias = pColumn.getAlias();
              if (alias == null) {
                  alias = pColumn.getColumn().getName();
              }
              addColumnName(alias);
          }
      }
  
      private void addColumnName(Column.Name pName) {
          String key = pName.toString().toUpperCase();
          Integer num = (Integer) columnNames.get(key);
          if (num == null) {
              num = new Integer(1);
          } else {
              num = new Integer(num.intValue() + 1);
          }
          columnNames.put(key, num);
      }
  
      protected void addCombinedConstraint(CombinedConstraint pConstraint) {
        for (Iterator iter = pConstraint.getParts();  iter.hasNext();  ) {
          Object o = iter.next();
          if (o instanceof CombinedConstraint) {
            addCombinedConstraint((CombinedConstraint) o);
          } else if (o instanceof BooleanConstraint) {
            addBooleanConstraint((BooleanConstraint) o);
          } else {
            throw new IllegalStateException("Invalid part type in CombinedConstraint: \
" + o);  }
        }
      }
  
      protected void addPart(Object pPart) {
          if (pPart instanceof SelectStatement) {
              addSelectStatement((SelectStatement) pPart);
          } else if (pPart instanceof CombinedConstraint) {
              addCombinedConstraint((CombinedConstraint) pPart);
          } else if (pPart instanceof Function) {
              addParts((Function) pPart);
          } else if (pPart instanceof ColumnReference
                  ||  pPart instanceof Value
                  ||  pPart instanceof RawSQLCode) {
              // Ignore me
          } else {
              throw new IllegalStateException("Invalid part type: " + pPart);
          }
      }
  
      protected void addParts(Parts pParts) {
          for (Iterator iter = pParts.getParts();  iter.hasNext();  ) {
              addPart(iter.next());
          }
      }
  
      protected void addBooleanConstraint(BooleanConstraint pConstraint) {
        BooleanConstraint.Type type = pConstraint.getType();
        if (BooleanConstraint.Type.EQ.equals(type)
            ||  BooleanConstraint.Type.EXISTS.equals(type)
            ||  BooleanConstraint.Type.GE.equals(type)
            ||  BooleanConstraint.Type.GT.equals(type)
            ||  BooleanConstraint.Type.IN.equals(type)
            ||  BooleanConstraint.Type.ISNULL.equals(type)
            ||  BooleanConstraint.Type.LE.equals(type)
            ||  BooleanConstraint.Type.LIKE.equals(type)
            ||  BooleanConstraint.Type.LT.equals(type)
            ||  BooleanConstraint.Type.NE.equals(type)) {
          addParts(pConstraint);
        } else {
          throw new IllegalStateException("Invalid part type in BooleanConstraint: " \
+ type);  }
      }
  
      protected String getUniqueAlias(String pSuggestion, Map pAliases) {
          String prefix;
          if (pSuggestion == null) {
              prefix = "";
          } else {
              prefix = pSuggestion;
          }
          if (!pAliases.containsKey(prefix)) {
              return prefix;
          }
          for (char c = '0';  c <= '9';  c++) {
              String s = prefix + c;
              if (!pAliases.containsKey(s)) {
                  return s;
              }
          }
          for (char c = 'A';  c <= 'Z';  c++) {
              String s = prefix + c;
              if (!pAliases.containsKey(s)) {
                  return s;
              }
          }
          return getUniqueAlias(prefix + '0', pAliases);
      }
  
      protected void createTableAliases() {
          if (tables.size() > 1) {
              // Make sure that all tables have an alias
              for (Iterator iter = tables.iterator();  iter.hasNext();  ) {
                  TableReference tableReference = (TableReference) iter.next();
                  if (tableReference.getAlias() == null) {
                      String alias = \
getUniqueAlias(tableReference.getTable().getName().getName(), aliases);  \
                aliases.put(alias, tableReference);
                      if \
(!alias.equals(tableReference.getTable().getName().getName())) {  \
tableReference.setAlias(alias);  }
                  }
              }
          }
      }
  
      protected void createColumnNames() {
        // Create a Map of all column names, that may be referenced.
        // maps key is the column name, and the maps value is the
        // number of possible references. In other words: If an entry
        // in the map has a value > 1, then its column name must be
        // qualified, because it is used in multiple tables.
        for (int i = 0;  i < tables.size();  i++) {
          TableReference table = (TableReference) tables.get(i);
          for (Iterator iter = table.getTable().getColumns();  iter.hasNext();  ) {
            Column col = (Column) iter.next();
            addColumnName(col.getName());
          }
        }
      }
  
      public Map getColumnNames() {
        return columnNames;
      }
    }
  
  
  1.8       +14 -1     ws-jaxme/src/js/org/apache/ws/jaxme/sqls/junit/CreateTest.java
  
  Index: CreateTest.java
  ===================================================================
  RCS file: /home/cvs/ws-jaxme/src/js/org/apache/ws/jaxme/sqls/junit/CreateTest.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- CreateTest.java	11 Mar 2004 11:03:13 -0000	1.7
  +++ CreateTest.java	25 Jun 2004 09:14:38 -0000	1.8
  @@ -145,7 +145,20 @@
           String s = generator.getQuery(insertStatement);
           assertEquals("INSERT INTO MySchema.MyTable (MyIndex, MyName, MyDate) \
VALUES (?, ?, ?)", s);  }
  -    
  +
  +    public void testBulkInsert() {
  +        Table table = getBasicTable();
  +        InsertStatement insertStatement = getSQLFactory().newInsertStatement();
  +        insertStatement.setTable(table);
  +        SelectStatement st = table.getSelectStatement();
  +        SQLGenerator generator = getSQLGenerator();
  +        generator.setLineTerminator("\n");
  +        insertStatement.setSubSelect(st);
  +        String got = generator.getQuery(insertStatement);
  +        String expect = "INSERT INTO MySchema.MyTable (MyIndex, MyName, MyDate) \
(SELECT MyIndex, MyName, MyDate FROM MySchema.MyTable)";  +        \
assertEquals(expect, got);  +    }
  +
       /** <p>Basic test for creating a <code>SELECT</code> statement.</p>
        */
       public void testBasicSelect() {
  
  
  
  1.10      +6 -6      \
ws-jaxme/src/js/org/apache/ws/jaxme/sqls/oracle/OraSQLGeneratorImpl.java  
  Index: OraSQLGeneratorImpl.java
  ===================================================================
  RCS file: /home/cvs/ws-jaxme/src/js/org/apache/ws/jaxme/sqls/oracle/OraSQLGeneratorImpl.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- OraSQLGeneratorImpl.java	17 Jun 2004 09:57:01 -0000	1.9
  +++ OraSQLGeneratorImpl.java	25 Jun 2004 09:14:38 -0000	1.10
  @@ -21,7 +21,7 @@
   import org.apache.ws.jaxme.sqls.SelectStatement;
   import org.apache.ws.jaxme.sqls.SelectTableReference;
   import org.apache.ws.jaxme.sqls.impl.SQLGeneratorImpl;
  -import org.apache.ws.jaxme.sqls.impl.SelectStatementMetaData;
  +import org.apache.ws.jaxme.sqls.impl.StatementMetaData;
   
   
   public class OraSQLGeneratorImpl extends SQLGeneratorImpl implements \
OraSQLGenerator {  @@ -41,11 +41,11 @@
           return isOracle8Compatibility;
       }
       
  -    protected SelectStatementMetaData newSelectStatementMetaData(SelectStatement \
pQuery) {  +    protected StatementMetaData \
newSelectStatementMetaData(SelectStatement pQuery) {  return new \
OraSelectStatementMetaData(pQuery);  }
   
  -    protected String getSelectQueryFromClause(SelectStatement pQuery, \
SelectStatementMetaData pData) {  +    protected String \
getSelectQueryFromClause(SelectStatement pQuery, StatementMetaData pData) {  if \
                (isOracle8Compatibility()) {
               SelectTableReference tableReference = \
pQuery.getSelectTableReference();  if (tableReference == null) {
  @@ -65,8 +65,8 @@
           }
       }
   
  -    protected String getSelectQueryConstraints(SelectStatement pQuery, \
                SelectStatementMetaData pData,
  -                                               SelectStatementMetaData.LocalData \
pLocalData) {  +    protected String getSelectQueryConstraints(SelectStatement \
pQuery, StatementMetaData pData,  +                                               \
StatementMetaData.LocalData pLocalData) {  String result;
           if (isOracle8Compatibility()) {
               SelectTableReference tableReference = \
pQuery.getSelectTableReference();  @@ -128,7 +128,7 @@
           return result;
       }
   
  -    protected String getColumnAlias(SelectStatementMetaData pData, ColumnReference \
pColumn) {  +    protected String getColumnAlias(StatementMetaData pData, \
ColumnReference pColumn) {  String s = super.getColumnAlias(pData, pColumn);
           if (pColumn.getTableReference() instanceof OraJoinReferenceImpl) {
               OraJoinReferenceImpl oraJoin = (OraJoinReferenceImpl) \
pColumn.getTableReference();  
  
  
  1.2       +2 -2      \
ws-jaxme/src/js/org/apache/ws/jaxme/sqls/oracle/OraSelectStatementMetaData.java  
  Index: OraSelectStatementMetaData.java
  ===================================================================
  RCS file: /home/cvs/ws-jaxme/src/js/org/apache/ws/jaxme/sqls/oracle/OraSelectStatementMetaData.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- OraSelectStatementMetaData.java	11 Mar 2004 11:03:12 -0000	1.1
  +++ OraSelectStatementMetaData.java	25 Jun 2004 09:14:38 -0000	1.2
  @@ -17,10 +17,10 @@
   package org.apache.ws.jaxme.sqls.oracle;
   
   import org.apache.ws.jaxme.sqls.SelectStatement;
  -import org.apache.ws.jaxme.sqls.impl.SelectStatementMetaData;
  +import org.apache.ws.jaxme.sqls.impl.StatementMetaData;
   
   
  -public class OraSelectStatementMetaData extends SelectStatementMetaData {
  +public class OraSelectStatementMetaData extends StatementMetaData {
       public OraSelectStatementMetaData(SelectStatement pQuery) {
           super(pQuery);
       }
  
  
  
  1.3       +12 -0     ws-jaxme/src/js/org/apache/ws/jaxme/sqls/InsertStatement.java
  
  Index: InsertStatement.java
  ===================================================================
  RCS file: /home/cvs/ws-jaxme/src/js/org/apache/ws/jaxme/sqls/InsertStatement.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- InsertStatement.java	16 Feb 2004 23:39:53 -0000	1.2
  +++ InsertStatement.java	25 Jun 2004 09:14:38 -0000	1.3
  @@ -22,4 +22,16 @@
    * @author <a href="mailto:joe@ispsoft.de">Jochen Wiedmann</a>
    */
   public interface InsertStatement extends SetStatement {
  +      /** <p>Adds a subselect; the columns returned by the subselect
  +       * will be inserted. This is used for bulk inserts like
  +       * <code>INSERT INTO foo (col1, col2, col2) (SELECT * FROM ...)</code>.</p>
  +       * @param pStatement The statement being performed to create
  +       *   the rows being inserted.
  +       */
  +      public void setSubSelect(SelectStatement pStatement);
  +
  +      /** <p>Returns a subselect previously being added with
  +       * {@link #setSubSelect(SelectStatement)}, or null.</p>
  +       */
  +      public SelectStatement getSubSelect();
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: jaxme-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: jaxme-dev-help@ws.apache.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic