[teiid-commits] teiid SVN: r4523 - in branches/7.7.x: engine/src/main/java/org/teiid/query/optimizer and 5 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Wed Oct 31 14:45:09 EDT 2012


Author: jolee
Date: 2012-10-31 14:45:08 -0400 (Wed, 31 Oct 2012)
New Revision: 4523

Modified:
   branches/7.7.x/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java
   branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/QueryOptimizer.java
   branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
   branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java
   branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java
   branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleImplementJoinStrategy.java
   branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java
   branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestOrderByProcessing.java
   branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestWindowFunctions.java
   branches/7.7.x/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestTPCR.java
Log:
TEIID-2245: Limit pushdown of nulls first/last

Modified: branches/7.7.x/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java
===================================================================
--- branches/7.7.x/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java	2012-10-30 21:51:45 UTC (rev 4522)
+++ branches/7.7.x/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java	2012-10-31 18:45:08 UTC (rev 4523)
@@ -93,7 +93,7 @@
     
     public QueryMetadataInterface getDesignTimeMetadata() {
     	if (isSession()) {
-    		return this.actualMetadata.getDesignTimeMetadata();
+    		return new TempMetadataAdapter(this.actualMetadata.getDesignTimeMetadata(), new TempMetadataStore());
     	}
     	return new TempMetadataAdapter(this.actualMetadata.getDesignTimeMetadata(), tempStore, materializationTables, queryNodes);
     }

Modified: branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/QueryOptimizer.java
===================================================================
--- branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/QueryOptimizer.java	2012-10-30 21:51:45 UTC (rev 4522)
+++ branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/QueryOptimizer.java	2012-10-31 18:45:08 UTC (rev 4523)
@@ -92,9 +92,14 @@
 		
         boolean debug = analysisRecord.recordDebug();
         
-        Map tempMetadata = command.getTemporaryMetadata();
-        metadata = new TempMetadataAdapter(metadata, new TempMetadataStore(tempMetadata));
+        if (!(metadata instanceof TempMetadataAdapter)) {
+        	metadata = new TempMetadataAdapter(metadata, new TempMetadataStore());
+        }
                 
+        if (context.getMetadata() == null) {
+        	context.setMetadata(metadata);
+        }
+        
         // Create an ID generator that can be used for all plans to generate unique data node IDs
         if(idGenerator == null) {
             idGenerator = new IDGenerator();

Modified: branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
===================================================================
--- branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java	2012-10-30 21:51:45 UTC (rev 4522)
+++ branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java	2012-10-31 18:45:08 UTC (rev 4523)
@@ -461,6 +461,7 @@
                 } else {
                     JoinNode joinAsSet = new JoinNode(getID());
                     joinAsSet.setJoinStrategy(new MergeJoinStrategy(SortOption.SORT_DISTINCT, SortOption.SORT_DISTINCT, true));
+                    //If we push these sorts, we will have to enforce null order, since nulls are equal here
                     List leftExpressions = (List) node.getFirstChild().getProperty(NodeConstants.Info.OUTPUT_COLS);
                     List rightExpressions = (List) node.getLastChild().getProperty(NodeConstants.Info.OUTPUT_COLS);
                     joinAsSet.setJoinType(setOp == Operation.EXCEPT ? JoinType.JOIN_ANTI_SEMI : JoinType.JOIN_SEMI);

Modified: branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java
===================================================================
--- branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java	2012-10-30 21:51:45 UTC (rev 4522)
+++ branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java	2012-10-31 18:45:08 UTC (rev 4523)
@@ -470,28 +470,16 @@
 			throws QueryMetadataException, TeiidComponentException {
 		boolean supportsNullOrdering = CapabilitiesUtil.supports(Capability.QUERY_ORDERBY_NULL_ORDERING, modelID, metadata, capFinder);
 		NullOrder defaultNullOrder = CapabilitiesUtil.getDefaultNullOrder(modelID, metadata, capFinder);
-		if (symbol.getNullOrdering() != null) {
-			if (!supportsNullOrdering) {
-				if (symbol.getNullOrdering() == NullOrdering.FIRST) {
-					if (defaultNullOrder != NullOrder.FIRST && !(symbol.isAscending() && defaultNullOrder == NullOrder.LOW) 
-							&& !(!symbol.isAscending() && defaultNullOrder == NullOrder.HIGH)) {
-						return false;
-					}
-				} else if (defaultNullOrder != NullOrder.LAST && !(symbol.isAscending() && defaultNullOrder == NullOrder.HIGH) 
-						&& !(!symbol.isAscending() && defaultNullOrder == NullOrder.LOW)) {
-					return false;
-				} 
-				symbol.setNullOrdering(null);
+		if (symbol.getNullOrdering() != null && !supportsNullOrdering) {
+			if (symbol.getNullOrdering() == NullOrdering.FIRST) {
+				if (defaultNullOrder != NullOrder.FIRST && !(symbol.isAscending() && defaultNullOrder == NullOrder.LOW) 
+						&& !(!symbol.isAscending() && defaultNullOrder == NullOrder.HIGH)) {
+			 					return false;
+			 				}
+			} else if (defaultNullOrder != NullOrder.LAST && !(symbol.isAscending() && defaultNullOrder == NullOrder.HIGH) 
+					&& !(!symbol.isAscending() && defaultNullOrder == NullOrder.LOW)) {
+				return false;
 			} 
-		} else if (supportsNullOrdering && defaultNullOrder != NullOrder.LOW) {
-			//try to match the expected default of low
-			if (symbol.isAscending()) {
-				if (defaultNullOrder != NullOrder.FIRST) {
-					symbol.setNullOrdering(NullOrdering.FIRST);
-				}
-			} else if (defaultNullOrder != NullOrder.LAST) {
-				symbol.setNullOrdering(NullOrdering.LAST);
-			}
 		}
 		return true;
 	}

Modified: branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java
===================================================================
--- branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java	2012-10-30 21:51:45 UTC (rev 4522)
+++ branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java	2012-10-31 18:45:08 UTC (rev 4523)
@@ -38,6 +38,7 @@
 import org.teiid.core.TeiidException;
 import org.teiid.core.TeiidRuntimeException;
 import org.teiid.core.types.DataTypeManager;
+import org.teiid.language.SortSpecification.NullOrdering;
 import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.metadata.SupportConstants;
@@ -71,8 +72,8 @@
 import org.teiid.query.sql.visitor.ExpressionMappingVisitor;
 import org.teiid.query.sql.visitor.ValueIteratorProviderCollectorVisitor;
 import org.teiid.query.util.CommandContext;
+import org.teiid.translator.ExecutionFactory.NullOrder;
 
-
 public final class RuleCollapseSource implements OptimizerRule {
 
 	public PlanNode execute(PlanNode plan, QueryMetadataInterface metadata, CapabilitiesFinder capFinder, RuleStack rules, AnalysisRecord analysisRecord, CommandContext context)
@@ -96,7 +97,7 @@
             		commandRoot = NodeEditor.findNodePreOrder(accessNode, NodeConstants.Types.SOURCE).getFirstChild();
             	}
                 plan = removeUnnecessaryInlineView(plan, commandRoot);
-                QueryCommand queryCommand = createQuery(metadata, capFinder, accessNode, commandRoot);
+                QueryCommand queryCommand = createQuery(context, capFinder, accessNode, commandRoot);
             	addDistinct(metadata, capFinder, accessNode, queryCommand);
                 command = queryCommand;
                 if (intoGroup != null) {
@@ -193,8 +194,10 @@
         return root;
     }
 
-	private QueryCommand createQuery(QueryMetadataInterface metadata, CapabilitiesFinder capFinder, PlanNode accessRoot, PlanNode node) throws QueryMetadataException, TeiidComponentException, QueryPlannerException {
+    private QueryCommand createQuery(CommandContext context, CapabilitiesFinder capFinder, PlanNode accessRoot, PlanNode node) throws QueryMetadataException, TeiidComponentException, QueryPlannerException {
+    	QueryMetadataInterface metadata = context.getMetadata();
 		PlanNode setOpNode = NodeEditor.findNodePreOrder(node, NodeConstants.Types.SET_OP, NodeConstants.Types.SOURCE);
+		Object modelID = RuleRaiseAccess.getModelIDFromAccess(accessRoot, metadata);
 		if (setOpNode != null) {
             Operation setOp = (Operation)setOpNode.getProperty(NodeConstants.Info.SET_OPERATION);
             SetQuery unionCommand = new SetQuery(setOp);
@@ -202,7 +205,7 @@
             unionCommand.setAll(unionAll);
             PlanNode sort = NodeEditor.findNodePreOrder(node, NodeConstants.Types.SORT, NodeConstants.Types.SET_OP);
             if (sort != null) {
-                processOrderBy(sort, unionCommand);
+                processOrderBy(sort, unionCommand, modelID, context, capFinder);
             }
             PlanNode limit = NodeEditor.findNodePreOrder(node, NodeConstants.Types.TUPLE_LIMIT, NodeConstants.Types.SET_OP);
             if (limit != null) {
@@ -210,7 +213,7 @@
             }
             int count = 0;
             for (PlanNode child : setOpNode.getChildren()) {
-                QueryCommand command = createQuery(metadata, capFinder, accessRoot, child);
+                QueryCommand command = createQuery(context, capFinder, accessRoot, child);
                 if (count == 0) {
                     unionCommand.setLeftQuery(command);
                 } else if (count == 1) {
@@ -229,11 +232,10 @@
         select.addSymbols(columns);
         query.setSelect(select);
 		query.setFrom(new From());
-		buildQuery(accessRoot, node, query, metadata, capFinder);
+		buildQuery(accessRoot, node, query, context, capFinder);
 		if (query.getCriteria() instanceof CompoundCriteria) {
             query.setCriteria(QueryRewriter.optimizeCriteria((CompoundCriteria)query.getCriteria(), metadata));
         }
-		Object modelID = RuleRaiseAccess.getModelIDFromAccess(accessRoot, metadata);
 		if (!CapabilitiesUtil.useAnsiJoin(modelID, metadata, capFinder)) {
 			simplifyFromClause(query);
         }
@@ -297,8 +299,8 @@
         return null;
     }
 
-    void buildQuery(PlanNode accessRoot, PlanNode node, Query query, QueryMetadataInterface metadata, CapabilitiesFinder capFinder) throws QueryMetadataException, TeiidComponentException, QueryPlannerException {
-        
+    void buildQuery(PlanNode accessRoot, PlanNode node, Query query, CommandContext context, CapabilitiesFinder capFinder) throws QueryMetadataException, TeiidComponentException, QueryPlannerException {
+    	QueryMetadataInterface metadata = context.getMetadata();    
     	//visit source and join nodes as they appear
         switch(node.getType()) {
             case NodeConstants.Types.JOIN:
@@ -324,12 +326,12 @@
                  * if the join is a left outer join, criteria from the right side will be added to the on clause
                  */
                 Criteria savedCriteria = null;
-                buildQuery(accessRoot, left, query, metadata, capFinder);
+                buildQuery(accessRoot, left, query, context, capFinder);
                 if (joinType == JoinType.JOIN_LEFT_OUTER) {
                     savedCriteria = query.getCriteria();
                     query.setCriteria(null);
                 } 
-                buildQuery(accessRoot, right, query, metadata, capFinder);
+                buildQuery(accessRoot, right, query, context, capFinder);
                 if (joinType == JoinType.JOIN_LEFT_OUTER) {
                     moveWhereClauseIntoOnClause(query, crits);
                     query.setCriteria(savedCriteria);
@@ -360,7 +362,7 @@
             {
             	if (Boolean.TRUE.equals(node.getProperty(NodeConstants.Info.INLINE_VIEW))) {
                     PlanNode child = node.getFirstChild();
-                    QueryCommand newQuery = createQuery(metadata, capFinder, accessRoot, child);
+                    QueryCommand newQuery = createQuery(context, capFinder, accessRoot, child);
                     
                     //ensure that the group is consistent
                     GroupSymbol symbol = node.getGroups().iterator().next();
@@ -374,7 +376,7 @@
     	}
             
         for (PlanNode childNode : node.getChildren()) {
-            buildQuery(accessRoot, childNode, query, metadata, capFinder);              
+            buildQuery(accessRoot, childNode, query, context, capFinder);              
         }
             
         switch(node.getType()) {
@@ -391,7 +393,7 @@
             }
             case NodeConstants.Types.SORT: 
             {
-                processOrderBy(node, query);
+                processOrderBy(node, query, RuleRaiseAccess.getModelIDFromAccess(accessRoot, metadata), context, capFinder);
                 break;
             }
             case NodeConstants.Types.DUP_REMOVE: 
@@ -486,8 +488,9 @@
         query.setCriteria(null);
     }
     
-	private void processOrderBy(PlanNode node, QueryCommand query) {
-		OrderBy orderBy = (OrderBy)node.getProperty(NodeConstants.Info.SORT_ORDER);
+    private void processOrderBy(PlanNode node, QueryCommand query, Object modelID, CommandContext context, CapabilitiesFinder capFinder) throws QueryMetadataException, TeiidComponentException {
+    	boolean userOrdering = NodeEditor.findParent(node, NodeConstants.Types.JOIN|NodeConstants.Types.SOURCE) == null;
+    	OrderBy orderBy = (OrderBy)node.getProperty(NodeConstants.Info.SORT_ORDER);
 		query.setOrderBy(orderBy);
 		if (query instanceof Query) {
 			List<SingleElementSymbol> cols = query.getProjectedSymbols();
@@ -496,6 +499,25 @@
 			}
 			QueryRewriter.rewriteOrderBy(query, orderBy, query.getProjectedSymbols(), new LinkedList<OrderByItem>());
 		}
+		boolean supportsNullOrdering = CapabilitiesUtil.supports(Capability.QUERY_ORDERBY_NULL_ORDERING, modelID, context.getMetadata(), capFinder);
+		NullOrder defaultNullOrder = CapabilitiesUtil.getDefaultNullOrder(modelID, context.getMetadata(), capFinder);
+		for (OrderByItem item : orderBy.getOrderByItems()) {
+			if (item.getNullOrdering() != null) {
+				if (!supportsNullOrdering) {
+					item.setNullOrdering(null);
+				}
+			// assuming true for backport,  context.getOptions().isPushdownDefaultNullOrder()
+			} else if (userOrdering && supportsNullOrdering && defaultNullOrder != NullOrder.LOW && true) {
+				//try to match the expected default of low
+				if (item.isAscending()) {
+					if (defaultNullOrder != NullOrder.FIRST) {
+						item.setNullOrdering(NullOrdering.FIRST);
+					}
+				} else if (defaultNullOrder != NullOrder.LAST) {
+					item.setNullOrdering(NullOrdering.LAST);
+				}
+			}
+		}
 	}
 
    /**

Modified: branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleImplementJoinStrategy.java
===================================================================
--- branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleImplementJoinStrategy.java	2012-10-30 21:51:45 UTC (rev 4522)
+++ branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleImplementJoinStrategy.java	2012-10-31 18:45:08 UTC (rev 4523)
@@ -34,9 +34,11 @@
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryPlannerException;
 import org.teiid.core.TeiidComponentException;
+import org.teiid.language.SortSpecification.NullOrdering;
 import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.optimizer.capabilities.CapabilitiesFinder;
+import org.teiid.query.optimizer.capabilities.SourceCapabilities.Capability;
 import org.teiid.query.optimizer.relational.OptimizerRule;
 import org.teiid.query.optimizer.relational.RuleStack;
 import org.teiid.query.optimizer.relational.plantree.NodeConstants;
@@ -48,9 +50,12 @@
 import org.teiid.query.processor.relational.JoinNode.JoinStrategyType;
 import org.teiid.query.processor.relational.MergeJoinStrategy.SortOption;
 import org.teiid.query.sql.lang.CompareCriteria;
+import org.teiid.query.sql.lang.CompoundCriteria;
 import org.teiid.query.sql.lang.Criteria;
+import org.teiid.query.sql.lang.IsNullCriteria;
 import org.teiid.query.sql.lang.JoinType;
 import org.teiid.query.sql.lang.OrderBy;
+import org.teiid.query.sql.lang.OrderByItem;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.GroupSymbol;
@@ -58,6 +63,7 @@
 import org.teiid.query.sql.util.SymbolMap;
 import org.teiid.query.sql.visitor.GroupsUsedByElementsVisitor;
 import org.teiid.query.util.CommandContext;
+import org.teiid.translator.ExecutionFactory.NullOrder;
 
 
 /**
@@ -249,14 +255,14 @@
         	if (distinct || NewCalculateCostUtil.usesKey(sourceNode, expressions, metadata)) {
                 joinNode.setProperty(joinNode.getFirstChild() == childNode ? NodeConstants.Info.IS_LEFT_DISTINCT : NodeConstants.Info.IS_RIGHT_DISTINCT, true);
         	}
-	        if (attemptPush && RuleRaiseAccess.canRaiseOverSort(sourceNode, metadata, capFinder, sortNode, null, false)) {
-	            sourceNode.getFirstChild().addAsParent(sortNode);
-	            
-	            if (needsCorrection) {
-	                correctOutputElements(joinNode, outputSymbols, sortNode);
-	            }
-	            return true;
-	        }
+        	if (attemptPush && RuleRaiseAccess.canRaiseOverSort(sourceNode, metadata, capFinder, sortNode, null, false)) {
+        		sourceNode.getFirstChild().addAsParent(sortNode);
+        		
+        		if (needsCorrection) {
+        			correctOutputElements(joinNode, outputSymbols, sortNode);
+        		}
+        		return true;
+        	}
         } else if (sourceNode.getType() == NodeConstants.Types.GROUP) {
         	sourceNode.addAsParent(sortNode);
         	sort = false; // the grouping columns must contain all of the ordering columns

Modified: branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java
===================================================================
--- branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java	2012-10-30 21:51:45 UTC (rev 4522)
+++ branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java	2012-10-31 18:45:08 UTC (rev 4523)
@@ -52,6 +52,7 @@
 import org.teiid.query.sql.symbol.GroupSymbol;
 import org.teiid.query.unittest.RealMetadataFactory;
 import org.teiid.translator.SourceSystemFunctions;
+import org.teiid.translator.ExecutionFactory.NullOrder;
 
 @SuppressWarnings("nls")
 public class TestJoinOptimization {

Modified: branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestOrderByProcessing.java
===================================================================
--- branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestOrderByProcessing.java	2012-10-30 21:51:45 UTC (rev 4522)
+++ branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestOrderByProcessing.java	2012-10-31 18:45:08 UTC (rev 4523)
@@ -34,6 +34,7 @@
 import org.teiid.query.optimizer.capabilities.FakeCapabilitiesFinder;
 import org.teiid.query.optimizer.capabilities.SourceCapabilities.Capability;
 import org.teiid.query.unittest.RealMetadataFactory;
+import org.teiid.query.util.CommandContext;
 import org.teiid.translator.ExecutionFactory.NullOrder;
 
 @SuppressWarnings({"nls", "unchecked"})
@@ -141,62 +142,68 @@
 	@Test public void testNullOrdering() throws Exception { 
         FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
         BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
-        caps.setCapabilitySupport(Capability.QUERY_ORDERBY_NULL_ORDERING, true);
+        //caps.setCapabilitySupport(Capability.QUERY_ORDERBY_NULL_ORDERING, true);
         capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
 
         ProcessorPlan plan = TestOptimizer.helpPlan("select e1 from pm1.g1 order by e1 desc, e2 asc", //$NON-NLS-1$ 
         		RealMetadataFactory.example1Cached(), null, capFinder, 
-    			new String[] { "SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0 ORDER BY c_0 DESC NULLS LAST, g_0.e2 NULLS FIRST"},  //$NON-NLS-1$
+        		new String[] { "SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0 ORDER BY c_0 DESC, g_0.e2"},  //$NON-NLS-1$
     			TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING);
         
         TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);
     }
 
-	@Test public void testNullOrdering1() throws Exception { 
-        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
-        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
-        caps.setCapabilitySupport(Capability.QUERY_ORDERBY_NULL_ORDERING, true);
-        caps.setSourceProperty(Capability.QUERY_ORDERBY_DEFAULT_NULL_ORDER, NullOrder.LAST);
-        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
-
-        ProcessorPlan plan = TestOptimizer.helpPlan("select e1 from pm1.g1 order by e1 desc, e2 asc", //$NON-NLS-1$ 
-        		RealMetadataFactory.example1Cached(), null, capFinder, 
-    			new String[] { "SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0 ORDER BY c_0 DESC, g_0.e2 NULLS FIRST"},  //$NON-NLS-1$
-    			TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING);
-        
-        TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);
-    }
-	
+		
 	@Test public void testNullOrdering2() throws Exception { 
-        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
-        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
-        caps.setCapabilitySupport(Capability.QUERY_ORDERBY_NULL_ORDERING, true);
-        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
-
-        ProcessorPlan plan = TestOptimizer.helpPlan("select e1 from pm1.g1 order by e1 desc NULLS FIRST, e2 asc NULLS LAST", //$NON-NLS-1$ 
-        		RealMetadataFactory.example1Cached(), null, capFinder, 
-    			new String[] { "SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0 ORDER BY c_0 DESC NULLS FIRST, g_0.e2 NULLS LAST"},  //$NON-NLS-1$
-    			TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING);
-        
-        TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);
-    }
-	
+	         FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+	         BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
+	         caps.setCapabilitySupport(Capability.QUERY_ORDERBY_NULL_ORDERING, true);
+	         caps.setSourceProperty(Capability.QUERY_ORDERBY_DEFAULT_NULL_ORDER, NullOrder.FIRST);
+	         capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+	        
+	         QueryMetadataInterface metadata = RealMetadataFactory.example1Cached();
+	         CommandContext cc = new CommandContext();
+	         //cc.setOptions(new Options().pushdownDefaultNullOrder(true));
+	         ProcessorPlan plan = TestOptimizer.getPlan(TestOptimizer.helpGetCommand("select e1 from pm1.g1 order by e1 desc, e2 asc NULLS LAST", metadata, null), metadata, capFinder, null, true, cc);
+	         TestOptimizer.checkAtomicQueries(new String[] { "SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0 ORDER BY c_0 DESC NULLS LAST, g_0.e2 NULLS LAST"}, plan);  //$NON-NLS-1$
+	         TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);
+	     }
+	 	
 	/**
 	 * The engine will remove the null ordering if it's not needed
 	 * @throws Exception
 	 */
 	@Test public void testNullOrdering3() throws Exception { 
-        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
-        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
-        caps.setSourceProperty(Capability.QUERY_ORDERBY_DEFAULT_NULL_ORDER, NullOrder.HIGH);
-        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+	         FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+	         BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
+	         caps.setSourceProperty(Capability.QUERY_ORDERBY_DEFAULT_NULL_ORDER, NullOrder.HIGH);
+	         capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+	        
+	         QueryMetadataInterface metadata = RealMetadataFactory.example1Cached();
+	         CommandContext cc = new CommandContext();
+	         //cc.setOptions(new Options().pushdownDefaultNullOrder(true));
+	         ProcessorPlan plan = TestOptimizer.getPlan(TestOptimizer.helpGetCommand("select e1 from pm1.g1 order by e1 desc, e2 asc NULLS LAST", metadata, null), metadata, capFinder, null, true, cc);
+	         TestOptimizer.checkAtomicQueries(new String[] { "SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0 ORDER BY c_0 DESC, g_0.e2"}, plan);  //$NON-NLS-1$
+	         TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);
+	     }
+	 	
+	 	/**
+	 	 * turns on virtualization
+	 	 * @throws Exception
+	 	 */
+	@Test public void testNullOrdering4() throws Exception { 
+	         FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+	         BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
+	         caps.setCapabilitySupport(Capability.QUERY_ORDERBY_NULL_ORDERING, true);
+	         caps.setSourceProperty(Capability.QUERY_ORDERBY_DEFAULT_NULL_ORDER, NullOrder.UNKNOWN);
+	         capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+	        
+	         QueryMetadataInterface metadata = RealMetadataFactory.example1Cached();
+	         CommandContext cc = new CommandContext();
+	         //cc.setOptions(new Options().pushdownDefaultNullOrder(true));
+	         ProcessorPlan plan = TestOptimizer.getPlan(TestOptimizer.helpGetCommand("select e1 from pm1.g1 order by e1 desc, e2 asc", metadata, null), metadata, capFinder, null, true, cc);
+	         TestOptimizer.checkAtomicQueries(new String[] { "SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0 ORDER BY c_0 DESC NULLS LAST, g_0.e2 NULLS FIRST"}, plan);  //$NON-NLS-1$
+	         TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);
+	     }
 
-        ProcessorPlan plan = TestOptimizer.helpPlan("select e1 from pm1.g1 order by e1 desc, e2 asc NULLS LAST", //$NON-NLS-1$ 
-        		RealMetadataFactory.example1Cached(), null, capFinder, 
-    			new String[] { "SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0 ORDER BY c_0 DESC, g_0.e2"},  //$NON-NLS-1$
-    			TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING);
-        
-        TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);
-    }
-
 }

Modified: branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestWindowFunctions.java
===================================================================
--- branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestWindowFunctions.java	2012-10-30 21:51:45 UTC (rev 4522)
+++ branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestWindowFunctions.java	2012-10-31 18:45:08 UTC (rev 4523)
@@ -38,6 +38,7 @@
 import org.teiid.query.processor.relational.ProjectNode;
 import org.teiid.query.processor.relational.WindowFunctionProjectNode;
 import org.teiid.query.unittest.RealMetadataFactory;
+import org.teiid.translator.ExecutionFactory.NullOrder;
 
 @SuppressWarnings({"nls", "unchecked"})
 public class TestWindowFunctions {
@@ -99,6 +100,7 @@
     	caps.setCapabilitySupport(Capability.ELEMENTARY_OLAP, true);
     	caps.setCapabilitySupport(Capability.WINDOW_FUNCTION_ORDER_BY_AGGREGATES, true);
     	caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_MAX, true);
+    	caps.setSourceProperty(Capability.QUERY_ORDERBY_DEFAULT_NULL_ORDER, NullOrder.UNKNOWN);
         ProcessorPlan plan = TestOptimizer.helpPlan("select max(e1) over (order by e1 nulls first) as y from pm1.g1", //$NON-NLS-1$
                                       RealMetadataFactory.example1Cached(), null, new DefaultCapabilitiesFinder(caps),
                                       new String[] {

Modified: branches/7.7.x/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestTPCR.java
===================================================================
--- branches/7.7.x/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestTPCR.java	2012-10-30 21:51:45 UTC (rev 4522)
+++ branches/7.7.x/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestTPCR.java	2012-10-31 18:45:08 UTC (rev 4523)
@@ -121,7 +121,7 @@
             new List[] { Arrays.asList(new Object[] { new Long(5), "Bill", "101 Fake St.", "392839283", "21.12" } ), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
                          Arrays.asList(new Object[] { new Long(6), "Stu", "102 Fake St.", "385729385", "51.50" } )}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 
-        dataMgr.addData("SELECT g_0.C_CUSTKEY AS c_0, g_0.C_NAME AS c_1, g_0.C_ADDRESS AS c_2, g_0.C_PHONE AS c_3, g_0.C_ACCTBAL AS c_4 FROM TPCR_Ora.CUSTOMER AS g_0 WHERE g_0.C_ACCTBAL > 50 ORDER BY c_0 NULLS FIRST", //$NON-NLS-1$
+        dataMgr.addData("SELECT g_0.C_CUSTKEY AS c_0, g_0.C_NAME AS c_1, g_0.C_ADDRESS AS c_2, g_0.C_PHONE AS c_3, g_0.C_ACCTBAL AS c_4 FROM TPCR_Ora.CUSTOMER AS g_0 WHERE g_0.C_ACCTBAL > 50 ORDER BY c_0", //$NON-NLS-1$
                         oracleExpected);
 
         List[] sqlServerExpected =
@@ -161,7 +161,7 @@
             new List[] { Arrays.asList(new Object[] { new Long(5), "Bill", "101 Fake St.", "392839283", "51.12" } ), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
                          Arrays.asList(new Object[] { new Long(6), "Stu", "102 Fake St.", "385729385", "51.50" } )}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 
-        dataMgr.addData("SELECT g_0.C_CUSTKEY AS c_0, g_0.C_NAME AS c_1, g_0.C_ADDRESS AS c_2, g_0.C_PHONE AS c_3, g_0.C_ACCTBAL AS c_4 FROM TPCR_Ora.CUSTOMER AS g_0 WHERE g_0.C_ACCTBAL > 50 ORDER BY c_0 NULLS FIRST", //$NON-NLS-1$
+        dataMgr.addData("SELECT g_0.C_CUSTKEY AS c_0, g_0.C_NAME AS c_1, g_0.C_ADDRESS AS c_2, g_0.C_PHONE AS c_3, g_0.C_ACCTBAL AS c_4 FROM TPCR_Ora.CUSTOMER AS g_0 WHERE g_0.C_ACCTBAL > 50 ORDER BY c_0", //$NON-NLS-1$
                         oracleExpected);
 
         List[] sqlServerExpected =



More information about the teiid-commits mailing list