[teiid-commits] teiid SVN: r3599 - in trunk: documentation/reference/src/main/docbook/en-US/content and 8 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Tue Nov 1 13:22:08 EDT 2011


Author: shawkins
Date: 2011-11-01 13:22:07 -0400 (Tue, 01 Nov 2011)
New Revision: 3599

Modified:
   trunk/build/kits/jboss-container/teiid-releasenotes.html
   trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeVirtual.java
   trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/FromClause.java
   trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
   trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java
   trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java
Log:
TEIID-1805 adding support for no_unnest control over view removal

Modified: trunk/build/kits/jboss-container/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-container/teiid-releasenotes.html	2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/build/kits/jboss-container/teiid-releasenotes.html	2011-11-01 17:22:07 UTC (rev 3599)
@@ -35,6 +35,7 @@
   <LI><B>GSSAPI</B> - both the Teiid JDBC client/server and the ODBC pg backend can now support GSSAPI for single sign-on. 
   <LI><B>Server-side Query Timeouts</B> - default query timeouts can be configured at both the VDB (via the query-timeout VDB property) and entire server (via the teiid-jboss-beans.xml queryTimeout property).
   <LI><B>Native Queries</B> - added the ability to specify native query SQL for JDBC physical tables and stored procedures via extension metadata.
+  <LI><B>View removal hint</B> - the NO_UNNEST hint now also applies to from clause views and subqueries.  It will instruct the planner to not perform view flattening.
 </UL>
 
 <h2><a name="Compatibility">Compatibility Issues</a></h2>

Modified: trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml	2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml	2011-11-01 17:22:07 UTC (rev 3599)
@@ -49,14 +49,15 @@
         <listitem><para>FROM table1 JOIN /*+ MAKEDEP */ table2 ON join-criteria</para></listitem>
         <listitem><para>FROM table1 JOIN /*+ MAKENOTDEP */ table2 ON join-criteria</para></listitem>
         <listitem><para>FROM /*+ MAKEIND */ table1 JOIN table2 ON join-criteria</para></listitem>
+        <listitem><para>FROM /*+ NO_UNNEST */ vw1 JOIN table2 ON join-criteria</para></listitem>
         <listitem><para>FROM table1 left outer join <link linkend="optional_join">/*+ optional */</link> table2 ON join-criteria</para></listitem>
         <listitem><para>FROM <link linkend="texttable">TEXTTABLE...</link></para></listitem>
         <listitem><para>FROM <link linkend="xmltable">XMLTABLE...</link></para></listitem>
         <listitem><para>FROM <link linkend="arraytable">ARRAYTABLE...</link></para></listitem>
         <listitem><para>FROM <link linkend="from_subquery">(SELECT ...</link></para></listitem>
       </itemizedlist> 
-      <note>
-        <title>DEP Hints</title>
+      <section>
+        <title>From Clause Hints</title>
         <para>
           MAKEIND, MAKEDEP, and MAKENOTDEP are hints used to control
           <link linkend="dependent_joins">dependent join</link>
@@ -65,7 +66,12 @@
           metadata, and costing information.  The hints may appear in a comment that proceeds the from clause.  
           The hints can be specified against any from clause, not just a named table.
         </para>
-      </note>
+        <para>
+          NO_UNNEST can be specified against a subquery from clause or view to instruct the planner to not merge 
+          the nested SQL in the surrounding query - also known as view flattening.  This hint only applies to Teiid
+          planning and is not passed to source queries.  NO_UNNEST may appear in a comment that proceeds the from clause.
+        </para>
+      </section>
       <section id="nested_table">
 		<title>Nested Table Reference</title>
 		<para>Nested tables may appear in the FROM clause with the TABLE

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2011-11-01 17:22:07 UTC (rev 3599)
@@ -839,6 +839,9 @@
             if (group.getModelMetadataId() != null) {
             	node.setProperty(Info.MODEL_ID, group.getModelMetadataId());
             }
+            if (ufc.isNoUnnest()) {
+            	node.setProperty(Info.NO_UNNEST, Boolean.TRUE);
+            }
             node.addGroup(group);
             if (nestedCommand != null) {
             	UpdateInfo info = ProcedureContainerResolver.getUpdateInfo(group, metadata);
@@ -882,6 +885,9 @@
             if (sfc.isTable()) {
     		    sfc.getCommand().setCorrelatedReferences(getCorrelatedReferences(parent, node, sfc));
             }
+            if (sfc.isNoUnnest()) {
+            	node.setProperty(Info.NO_UNNEST, Boolean.TRUE);
+            }
             node.addGroup(group);
             addNestedCommand(node, group, nestedCommand, nestedCommand, true);
 			if (nestedCommand instanceof SetQuery) {

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java	2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java	2011-11-01 17:22:07 UTC (rev 3599)
@@ -126,6 +126,7 @@
         CORRELATED_REFERENCES,  // SymbolMap
         MAKE_NOT_DEP,       // Boolean
         INLINE_VIEW,        // If the source node represents an inline view
+        NO_UNNEST,
         MAKE_IND,
         
         // Group node properties

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeVirtual.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeVirtual.java	2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeVirtual.java	2011-11-01 17:22:07 UTC (rev 3599)
@@ -81,7 +81,9 @@
     static PlanNode doMerge(PlanNode frame,
                             PlanNode root, boolean beforeDecomposeJoin,
                             QueryMetadataInterface metadata) throws QueryPlannerException, QueryMetadataException, TeiidComponentException {
-
+    	if (frame.hasBooleanProperty(Info.NO_UNNEST)) {
+    		return root;
+    	}
         GroupSymbol virtualGroup = frame.getGroups().iterator().next();
 
         // check to see if frame represents a proc relational query.

Modified: trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java	2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java	2011-11-01 17:22:07 UTC (rev 3599)
@@ -180,7 +180,9 @@
                 fromClause.setMakeNotDep(true);
             } else if (parts[i].equalsIgnoreCase(FromClause.MAKEIND)) {
                 fromClause.setMakeInd(true);
-            }       
+            } else if (parts[i].equalsIgnoreCase(SubqueryHint.NOUNNEST)) {
+            	fromClause.setNoUnnest(true);
+            }
         }
     }
     

Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/FromClause.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/FromClause.java	2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/FromClause.java	2011-11-01 17:22:07 UTC (rev 3599)
@@ -45,6 +45,7 @@
     private boolean makeDep;
     private boolean makeNotDep;
     private boolean makeInd;
+    private boolean noUnnest;
 
     public boolean isOptional() {
         return optional;
@@ -72,8 +73,17 @@
     	clone.makeInd = makeInd;
     	clone.makeNotDep = makeNotDep;
     	clone.optional = optional;
+    	clone.noUnnest = noUnnest;
     	return clone;
     }
+    
+    public void setNoUnnest(boolean noUnnest) {
+		this.noUnnest = noUnnest;
+	}
+    
+    public boolean isNoUnnest() {
+		return noUnnest;
+	}
 
     public boolean isMakeDep() {
         return this.makeDep;
@@ -92,7 +102,7 @@
     }
     
     public boolean hasHint() {
-        return optional || makeDep || makeNotDep || makeInd;
+        return optional || makeDep || makeNotDep || makeInd || noUnnest;
     }
     
     public boolean equals(Object obj) {
@@ -109,7 +119,8 @@
         return other.isOptional() == this.isOptional()
                && other.isMakeDep() == this.isMakeDep()
                && other.isMakeNotDep() == this.isMakeNotDep()
-        	   && other.isMakeInd() == this.isMakeInd();
+        	   && other.isMakeInd() == this.isMakeInd()
+        	   && other.isNoUnnest() == this.isNoUnnest();
     }
     
     @Override

Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java	2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java	2011-11-01 17:22:07 UTC (rev 3599)
@@ -530,6 +530,10 @@
                 append(FromClause.MAKEIND);
                 append(SPACE);
             }
+            if (obj.isNoUnnest()) {
+                append(SubqueryHint.NOUNNEST);
+                append(SPACE);
+            }
             append(END_HINT);
             append(SPACE);
     	}

Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java	2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java	2011-11-01 17:22:07 UTC (rev 3599)
@@ -48,6 +48,24 @@
         TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);                                    
     }
     
+    @Test public void testNoUnnest() {
+        ProcessorPlan plan = TestOptimizer.helpPlan("SELECT x FROM /*+ no_unnest */ (SELECT e1, max(e2) as x FROM pm1.g1 GROUP BY e1) AS z", //$NON-NLS-1$
+                                      RealMetadataFactory.example1Cached(), null, TestAggregatePushdown.getAggregatesFinder(),
+                                      new String[] {
+                                          "SELECT v_0.c_0 FROM (SELECT MAX(g_0.e2) AS c_0 FROM pm1.g1 AS g_0 GROUP BY g_0.e1) AS v_0"}, TestOptimizer.SHOULD_SUCCEED); //$NON-NLS-1$
+    
+        TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);                                    
+    }
+    
+    @Test public void testNoUnnestView() {
+        ProcessorPlan plan = TestOptimizer.helpPlan("SELECT e1 FROM /*+ no_unnest */ vm1.g1", //$NON-NLS-1$
+                                      RealMetadataFactory.example1Cached(), null, TestAggregatePushdown.getAggregatesFinder(),
+                                      new String[] {
+                                          "SELECT v_0.c_0 FROM (SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0) AS v_0"}, TestOptimizer.SHOULD_SUCCEED); //$NON-NLS-1$
+    
+        TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);                                    
+    }
+    
     @Test public void testSimpleMergeGroupBy1() {
         ProcessorPlan plan = TestOptimizer.helpPlan("SELECT x FROM (SELECT distinct min(e1), max(e2) as x FROM pm1.g1 GROUP BY e1) AS z", //$NON-NLS-1$
                                       RealMetadataFactory.example1Cached(), null, TestAggregatePushdown.getAggregatesFinder(),

Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java	2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java	2011-11-01 17:22:07 UTC (rev 3599)
@@ -29,6 +29,7 @@
 import java.util.List;
 
 import org.junit.Test;
+import org.teiid.api.exception.query.QueryParserException;
 import org.teiid.query.sql.lang.AbstractCompareCriteria;
 import org.teiid.query.sql.lang.CacheHint;
 import org.teiid.query.sql.lang.CompareCriteria;
@@ -57,12 +58,12 @@
 import org.teiid.query.sql.proc.HasCriteria;
 import org.teiid.query.sql.proc.IfStatement;
 import org.teiid.query.sql.proc.Statement;
-import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.Function;
 import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.Reference;
 
 @SuppressWarnings("nls")
@@ -1156,4 +1157,9 @@
         TestParser.helpTest(sql, "SELECT a FROM db.g WHERE b IN /*+ MJ */ (SELECT a FROM db.g WHERE a2 = 5)", q);         //$NON-NLS-1$
     }
     
+    @Test public void testNoUnnest() throws QueryParserException {
+        String sql = "SELECT a FROM /*+ no_unnest */ (SELECT a FROM db.g WHERE a2 = 5) x"; //$NON-NLS-1$
+        assertEquals("SELECT a FROM /*+ NO_UNNEST */ (SELECT a FROM db.g WHERE a2 = 5) AS x", QueryParser.getQueryParser().parseCommand(sql, new ParseInfo()).toString());         //$NON-NLS-1$
+    }
+    
 }



More information about the teiid-commits mailing list