union statements as views
-------------------------

                 Key: JAXME-93
                 URL: https://issues.apache.org/jira/browse/JAXME-93
             Project: JaxMe
          Issue Type: Improvement
          Components: JaxMeJS
            Reporter: Tobias Hühner


Index: 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SelectCombinationStatementImpl.java
===================================================================
--- 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SelectCombinationStatementImpl.java
 (revision 567598)
+++ 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SelectCombinationStatementImpl.java
 (working copy)
@@ -7,6 +7,7 @@
 import org.apache.ws.jaxme.sqls.SQLFactory;
 import org.apache.ws.jaxme.sqls.SelectCombinationStatement;
 import org.apache.ws.jaxme.sqls.SelectStatement;
+import org.apache.ws.jaxme.sqls.Table;
 
 
 /**
@@ -24,6 +25,17 @@
     }
 
     public Iterator getSelectStatements() {
-        return statements.iterator();
+        if(statements.isEmpty()){
+                       throw new IllegalStateException("No Statement 
defined"); 
+        }
+       return statements.iterator();
     }
+    
+       public Table createView(Table.Name pName) {
+               return getSQLFactory().getObjectFactory().newView(this,pName);
+       }
+
+       public Table createView(String pName) {
+           return createView(pName == null ? null : new 
TableImpl.NameImpl(pName));
+       }
 }
Index: 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SelectCombinationViewImpl.java
===================================================================
--- 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SelectCombinationViewImpl.java
      (revision 0)
+++ 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SelectCombinationViewImpl.java
      (revision 0)
@@ -0,0 +1,126 @@
+package org.apache.ws.jaxme.sqls.impl;
+
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.ws.jaxme.sqls.Column;
+import org.apache.ws.jaxme.sqls.ColumnReference;
+import org.apache.ws.jaxme.sqls.DeleteStatement;
+import org.apache.ws.jaxme.sqls.ForeignKey;
+import org.apache.ws.jaxme.sqls.Index;
+import org.apache.ws.jaxme.sqls.InsertStatement;
+import org.apache.ws.jaxme.sqls.SelectCombinationStatement;
+import org.apache.ws.jaxme.sqls.SelectStatement;
+import org.apache.ws.jaxme.sqls.Table;
+import org.apache.ws.jaxme.sqls.UpdateStatement;
+import org.apache.ws.jaxme.sqls.Column.Type;
+
+public class SelectCombinationViewImpl extends TableImpl implements Table {
+       private final SelectCombinationStatement statement;
+
+       protected SelectCombinationViewImpl(SelectCombinationStatement 
pStatement, Name pName) {
+               
super((getFirstStatement(pStatement)).getTableReference().getTable().getSchema(),
+                               pName == null ? 
(getFirstStatement(pStatement)).getTableReference().getTable().getName() : 
pName);
+               statement = pStatement;
+       }
+
+       private static SelectStatement 
getFirstStatement(SelectCombinationStatement pStatement) {
+               return (SelectStatement)pStatement.getSelectStatements().next();
+       }
+
+       public final SelectCombinationStatement getSelectCombinationStatement() 
{
+               return statement;
+       }
+    private class ViewColumnImpl implements Column {
+        private final Column.Name colName;
+        private final Column col;
+        private Object data;
+        private ViewColumnImpl(ColumnReference pColumn) {
+            col = pColumn.getColumn();
+            Column.Name alias = pColumn.getAlias();
+            colName = alias == null ? col.getName() : alias;
+        }
+        public Table getTable() { return SelectCombinationViewImpl.this; }
+        public Name getName() { return colName; }
+        public String getQName() { return getTable() + "." + getName(); }
+        public Type getType() { return col.getType(); }
+        public boolean isPrimaryKeyPart() { return false; }
+        public void setNullable(boolean pNullable) {
+            throw new IllegalStateException("Unable to set a view columns 
'Nullable' property.");
+        }
+        public boolean isNullable() { return col.isNullable(); }
+        public boolean isStringColumn() { return col.isStringColumn(); }
+        public boolean isBinaryColumn() { return col.isBinaryColumn(); }
+        public void setCustomData(Object pData) { data = pData; }
+        public Object getCustomData() { return data; }
+        public boolean isVirtual() { return false; }
+    }
+
+    public Iterator getColumns() {
+        List result = new ArrayList();
+        for (Iterator iter = getFirstStatement(statement).getResultColumns();  
iter.hasNext();  ) {
+            ColumnReference col = (ColumnReference) iter.next();
+            result.add(new ViewColumnImpl(col));
+        }
+        return result.iterator();
+    }
+
+    public Column getColumn(Column.Name pName) {
+        if (pName == null) {
+            throw new NullPointerException("Column names must not be null.");
+         }
+        for (Iterator iter = getFirstStatement(statement).getResultColumns();  
iter.hasNext();  ) {
+            ColumnReference col = (ColumnReference) iter.next();
+            Column.Name alias = col.getAlias();
+            if (alias == null) {
+               alias = col.getColumn().getName();
+            }
+            if (alias.equals(pName)) {
+                return new ViewColumnImpl(col);
+            }
+        }
+        return null;
+    }
+       
+    public Column newColumn(Column.Name pName, Type pType) {
+        throw new IllegalStateException("A views columns cannot be changed.");
+    }
+
+    public Column newColumn(String pName, Type pType) {
+        throw new IllegalStateException("A views columns cannot be changed.");
+    }
+
+    public Index newKey() {
+        throw new IllegalStateException("A view cannot have keys.");
+    }
+    public Index newIndex() {
+        throw new IllegalStateException("A view cannot have indexes.");
+    }
+    public Index newPrimaryKey() {
+        throw new IllegalStateException("A view cannot have a primary key.");
+    }
+    public ForeignKey newForeignKey(Table pReferencedTable) {
+        throw new IllegalStateException("A view cannot have foreign keys.");
+    }
+    public InsertStatement getInsertStatement() {
+        throw new IllegalStateException("A view is not updateable.");
+    }
+    public UpdateStatement getUpdateStatement() {
+        throw new IllegalStateException("A view is not updateable.");
+    }
+    public DeleteStatement getDeleteStatement() {
+        throw new IllegalStateException("A view is not updateable.");
+    }
+    public Index getPrimaryKey() {
+        throw new IllegalStateException("A view cannot have a primary key.");
+    }
+    public Iterator getIndexes() {
+        throw new IllegalStateException("A view cannot have indexes.");
+    }
+    public Iterator getForeignKeys() {
+        throw new IllegalStateException("A view cannot have foreign keys.");
+    }
+
+}
Index: 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/ObjectFactoryImpl.java
===================================================================
--- 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/ObjectFactoryImpl.java
      (revision 567598)
+++ 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/ObjectFactoryImpl.java
      (working copy)
@@ -32,6 +32,7 @@
 import org.apache.ws.jaxme.sqls.Table;
 import org.apache.ws.jaxme.sqls.TableReference;
 import org.apache.ws.jaxme.sqls.CombinedConstraint.Type;
+import org.apache.ws.jaxme.sqls.Table.Name;
 
 
 /** <p>Default implementation of the object factory.</p>
@@ -58,6 +59,12 @@
     public Table newView(SelectStatement pSelectStatement, Table.Name pName) {
         return new ViewImpl(pSelectStatement, pName);
     }
+       
+    public Table newView(
+                       SelectCombinationStatementImpl 
selectCombinationStatementImpl,
+                       Name name) {
+               return new 
SelectCombinationViewImpl(selectCombinationStatementImpl,name);
+       }
 
     public CombinedConstraint newCombinedConstraint(ConstrainedStatement 
pStatement, Type pType) {
         return new CombinedConstraintImpl(pStatement, pType);
@@ -74,4 +81,5 @@
        public Expression createExpression(Statement pStatement, 
org.apache.ws.jaxme.sqls.Expression.Type pType) {
                return new ExpressionImpl(pStatement, pType);
        }
+
 }
Index: 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SQLGeneratorImpl.java
===================================================================
--- 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SQLGeneratorImpl.java
       (revision 567598)
+++ 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SQLGeneratorImpl.java
       (working copy)
@@ -592,6 +592,9 @@
         if (t instanceof ViewImpl) {
             ViewImpl v = (ViewImpl) t;
             tableName = "(" + getSelectQuery(v.getViewStatement(), pData) + 
")";
+        } else if (t instanceof SelectCombinationViewImpl) {
+               SelectCombinationViewImpl view = (SelectCombinationViewImpl) t;
+               tableName = "(" + 
getQuery(view.getSelectCombinationStatement()) + ")";
         } else {
             tableName = pTable.getTable().getQName();
         }
@@ -1034,6 +1037,11 @@
             checkSameStructure(first, other);
             sb.append(' ');
             sb.append(pSep);
+            if(pStatement instanceof UnionStatement) {
+               if(((UnionStatement)pStatement).isAll(other)){
+                    sb.append(" ALL");
+               }
+            };
             sb.append(" (");
             sb.append(getQuery(other));
             sb.append(')');
@@ -1052,9 +1060,7 @@
         } else if (pStatement instanceof SelectStatement) {
             s = getSelectQuery((SelectStatement) pStatement);
         } else if (pStatement instanceof UnionStatement) {
-            final UnionStatement us = (UnionStatement) pStatement;
-            final boolean all = us.isAll();
-            s = getSelectCombinationStatement(us, all ? "UNION ALL" : "UNION");
+            s = getSelectCombinationStatement((UnionStatement) pStatement, 
"UNION");
         } else if (pStatement instanceof IntersectionStatement) {
             s = getSelectCombinationStatement((IntersectionStatement) 
pStatement, "INTERSECT");
         } else if (pStatement instanceof MinusStatement) {
Index: 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/UnionStatementImpl.java
===================================================================
--- 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/UnionStatementImpl.java
     (revision 567598)
+++ 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/UnionStatementImpl.java
     (working copy)
@@ -1,6 +1,9 @@
 package org.apache.ws.jaxme.sqls.impl;
 
+import java.util.HashMap;
+
 import org.apache.ws.jaxme.sqls.SQLFactory;
+import org.apache.ws.jaxme.sqls.SelectStatement;
 import org.apache.ws.jaxme.sqls.UnionStatement;
 
 
@@ -8,17 +11,28 @@
  * Default implementation of [EMAIL PROTECTED] UnionStatement}.
  */
 public class UnionStatementImpl extends SelectCombinationStatementImpl 
implements UnionStatement {
-    private boolean all;
-    
+       private final HashMap all = new HashMap(); 
+       private boolean first = true;
+       
     protected UnionStatementImpl(SQLFactory pFactory) {
         super(pFactory);
     }
 
-    public boolean isAll() {
-        return all;
-    }
+       public void addStatement(SelectStatement statement, boolean pAll) {
+               if(first && pAll){
+                       throw new IllegalArgumentException(" pAll=true for 
first Statement is not allowed");
+               }
+               super.addStatement(statement);
+               all.put(statement,new Boolean(pAll));
+               first = false;
+       }
+       
+       public void addStatement(SelectStatement statement) {
+               addStatement(statement,false);
+       }
 
-    public void setAll(boolean pAll) {
-        all = pAll;
-    }
+       public boolean isAll(SelectStatement statement) {
+               return ((Boolean)all.get(statement)).booleanValue();
+       }
+
 }
Index: 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/SelectCombinationStatement.java
===================================================================
--- 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/SelectCombinationStatement.java
  (revision 567598)
+++ 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/SelectCombinationStatement.java
  (working copy)
@@ -7,10 +7,9 @@
  * Common base interface for [EMAIL PROTECTED] UnionStatement}, and
  * [EMAIL PROTECTED] IntersectionStatement}.
  */
-public interface SelectCombinationStatement extends Statement {
+public interface SelectCombinationStatement extends Statement, 
ViewableStatement {
     /**
-     * Adds a select statement to the given "union", or
-     * "intersection" statement.
+     * Adds a select statement to the given "union", "intersection", or 
"minus" statement.
      */
     void addStatement(SelectStatement pStatement);
 
@@ -18,4 +17,5 @@
      * Returns an iterator over all the select statements.
      */
     Iterator getSelectStatements();
+
 }
Index: 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/ObjectFactory.java
===================================================================
--- 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/ObjectFactory.java
       (revision 567598)
+++ 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/ObjectFactory.java
       (working copy)
@@ -16,6 +16,8 @@
 package org.apache.ws.jaxme.sqls;
 
 import org.apache.ws.jaxme.sqls.Expression.Type;
+import org.apache.ws.jaxme.sqls.Table.Name;
+import org.apache.ws.jaxme.sqls.impl.SelectCombinationStatementImpl;
 
 
 /** A factory object for creating all the objects used by
@@ -46,6 +48,16 @@
      */
     public Table newView(SelectStatement pSelectStatement, Table.Name pName);
 
+    /** Returns an instance of
+     * [EMAIL PROTECTED] org.apache.ws.jaxme.sqls.Table}, which allows to embed
+     * the given instance of
+     * [EMAIL PROTECTED] org.apache.ws.jaxme.sqls.SelectCombinationStatement} 
into another
+     * SELECT statement.
+     */
+    public Table newView(
+                       SelectCombinationStatementImpl 
selectCombinationStatementImpl,
+                       Name name);
+
     /** Creates a new instance of
      * [EMAIL PROTECTED] org.apache.ws.jaxme.sqls.Constraint} constraining
      * the given [EMAIL PROTECTED] 
org.apache.ws.jaxme.sqls.ConstrainedStatement}.
@@ -64,4 +76,5 @@
        /** Creates a new instance of [EMAIL PROTECTED] Expression}.
         */
        public Expression createExpression(Statement pStatement, Type sum);
+
 }
Index: 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/SelectStatement.java
===================================================================
--- 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/SelectStatement.java
     (revision 567598)
+++ 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/SelectStatement.java
     (working copy)
@@ -23,7 +23,7 @@
  *
  * @author <a href="mailto:[EMAIL PROTECTED]">Jochen Wiedmann</a>
  */
-public interface SelectStatement extends ConstrainedStatement {
+public interface SelectStatement extends 
ConstrainedStatement,ViewableStatement {
        /** Provides a single column for an <code>ORDER BY</code>
      * clause.
         */
@@ -111,14 +111,4 @@
     */
    public int getSkippedRows();
 
-   /** <p>Creates a view, which may be used to embed the statement into
-    * a separate query.</p>
-    */
-   public Table createView(Table.Name pName);
-
-
-   /** <p>Creates a view, which may be used to embed the statement into
-    * a separate query.</p>
-    */
-   public Table createView(String pName);
 }
Index: 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/junit/CreateTest.java
===================================================================
--- 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/junit/CreateTest.java
    (revision 567598)
+++ 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/junit/CreateTest.java
    (working copy)
@@ -458,7 +458,7 @@
                assertEquals(expect, got);
        }
 
-       /** Test for UNION and UNION ALL.
+       /** Test for UNION.
         */
        public void testUnion() {
         UnionStatement us = getSQLFactory().newUnionStatement();
@@ -467,7 +467,23 @@
         String got = gen.getQuery(us);
         String expect = "(SELECT MyIndex, MyName, MyDate FROM MySchema.MyTable 
WHERE 'MyIndex'>5) UNION (SELECT MyIndex, MyName, MyDate FROM MySchema.MyTable 
WHERE 'MyName' LIKE 'x%')";
         assertEquals(expect, got);
-        us.setAll(true);
+       }
+       /** Test for UNION ALL.
+        */
+       public void testUnionAll() {
+        UnionStatement us = getSQLFactory().newUnionStatement();
+           Table t = getBasicTable();
+               SelectStatement st1 = t.getSelectStatement();
+               SelectStatement st2 = t.getSelectStatement();
+               BooleanConstraint bc1 = st1.getWhere().createGT();
+               bc1.addPart("MyIndex");
+               bc1.addPart(5);
+               BooleanConstraint bc2 = st2.getWhere().createLIKE();
+               bc2.addPart("MyName");
+               bc2.addPart("x%");
+               us.addStatement(st1);
+               us.addStatement(st2,true);
+        SQLGenerator gen = getSQLGenerator();
         String gotAll = gen.getQuery(us);
         String expectAll = "(SELECT MyIndex, MyName, MyDate FROM 
MySchema.MyTable WHERE 'MyIndex'>5) UNION ALL (SELECT MyIndex, MyName, MyDate 
FROM MySchema.MyTable WHERE 'MyName' LIKE 'x%')";
         assertEquals(expectAll, gotAll);
@@ -516,4 +532,21 @@
             // Ok
         }
     }
+
+       /** Test for UNION and UNION ALL.
+        */
+       public void testUnionView() {
+        UnionStatement us = getSQLFactory().newUnionStatement();
+           createSelectCombinationStatement(us);
+           Table view = us.createView((String)null);
+           // SelectStatemnt st = SELECT * FROM view ...
+           SelectStatement st = getSQLFactory().newSelectStatement();
+           st.setTable(view);
+           
+           SQLGenerator gen = getSQLGenerator();
+        String got = gen.getQuery(st);
+        String expect = "SELECT * FROM ((SELECT MyIndex, MyName, MyDate FROM 
MySchema.MyTable WHERE 'MyIndex'>5) UNION (SELECT MyIndex, MyName, MyDate FROM 
MySchema.MyTable WHERE 'MyName' LIKE 'x%'))";
+        assertEquals(expect, got);
+       }
+
 }
Index: 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/UnionStatement.java
===================================================================
--- 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/UnionStatement.java
      (revision 567598)
+++ 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/UnionStatement.java
      (working copy)
@@ -6,14 +6,15 @@
  */
 public interface UnionStatement extends SelectCombinationStatement {
     /**
+     * Adds a select statement to the given "union", "intersection", or 
"minus" statement.
      * Sets, whether this is a "union all" statement. By default,
      * it isn't.
      */
-    void setAll(boolean pAll);
-
+    void addStatement(SelectStatement pStatement,boolean all);
+    
     /**
-     * Returns, whether this is a "union all" statement. By default,
-     * it isn't.
+     * is 'union all' Statement
      */
-    boolean isAll();
+    boolean isAll(SelectStatement pStatement);
+
 }
Index: 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/ViewableStatement.java
===================================================================
--- 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/ViewableStatement.java
   (revision 0)
+++ 
D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/ViewableStatement.java
   (revision 0)
@@ -0,0 +1,18 @@
+package org.apache.ws.jaxme.sqls;
+
+/**
+ * this interface describe the potential use as view for a statement
+ */
+public interface ViewableStatement {
+
+       /** <p>Creates a view, which may be used to embed the statement into
+        * a separate query.</p>
+        */
+       public abstract Table createView(Table.Name pName);
+
+       /** <p>Creates a view, which may be used to embed the statement into
+        * a separate query.</p>
+        */
+       public abstract Table createView(String pName);
+
+}
\ No newline at end of file


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


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

Reply via email to