From teiid-commits at lists.jboss.org Fri Jul 31 11:42:46 2009 Content-Type: multipart/mixed; boundary="===============4658165262335912629==" MIME-Version: 1.0 From: teiid-commits at lists.jboss.org To: teiid-commits at lists.jboss.org Subject: [teiid-commits] teiid SVN: r1211 - in trunk: engine/src/main/java/com/metamatrix/query/optimizer/relational/rules and 3 other directories. Date: Fri, 31 Jul 2009 11:42:46 -0400 Message-ID: <200907311542.n6VFgkIY021795@svn01.web.mwc.hst.phx2.redhat.com> --===============4658165262335912629== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Author: shawkins Date: 2009-07-31 11:42:46 -0400 (Fri, 31 Jul 2009) New Revision: 1211 Modified: trunk/documentation/reference/src/main/docbook/en-US/content/federated_p= lanning.xml trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rul= es/NewCalculateCostUtil.java trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rul= es/RuleCollapseSource.java trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rul= es/RuleImplementJoinStrategy.java trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rul= es/RulePushAggregates.java trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rul= es/RuleRemoveOptionalJoins.java trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestAggregateP= ushdown.java trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptimizer.= java trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptionalJo= ins.java trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestStoredProc= edurePlanning.java trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestUnionPlann= ing.java trunk/engine/src/test/java/com/metamatrix/query/processor/TestSetProcess= ing.java trunk/engine/src/test/java/com/metamatrix/query/processor/TestVirtualDep= Join.java trunk/engine/src/test/java/com/metamatrix/query/processor/relational/Tes= tSortNode.java Log: TEIID-339 expanding and correcting the check to use all rows and making the= condition to push distinct stricter. Modified: trunk/documentation/reference/src/main/docbook/en-US/content/fede= rated_planning.xml =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/documentation/reference/src/main/docbook/en-US/content/federated_= planning.xml 2009-07-31 13:15:35 UTC (rev 1210) +++ trunk/documentation/reference/src/main/docbook/en-US/content/federated_= planning.xml 2009-07-31 15:42:46 UTC (rev 1211) @@ -214,7 +214,7 @@ Partial Aggregate Pushdown Partial aggregate pushdown allows for grouping operations - above multi-source joins to be decomposed so that some of the + above multi-source joins and unions to be decomposed so that some = of the grouping and aggregate functions may be pushed down to the sources. @@ -239,10 +239,13 @@ select a.column1 from a - When a join clause is omitted, the relevant join criteria + When a join clause is omitted via the optional join hint, th= e relevant join criteria is not applied. Thus it is possible that the query results may not have the same cardinality or even the same row values as when the join is fully applied. + Left/right outer joins where the inner side values are not used + and whose rows under go a distinct operation will automatically be + treated as an optional join and does not require a hint. Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relatio= nal/rules/NewCalculateCostUtil.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/ru= les/NewCalculateCostUtil.java 2009-07-31 13:15:35 UTC (rev 1210) +++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/ru= les/NewCalculateCostUtil.java 2009-07-31 15:42:46 UTC (rev 1211) @@ -87,8 +87,8 @@ // the following variables are used to hold cost estimates (roughly in= milliseconds) private final static float compareTime =3D .05f; //TODO: a better esti= mate would be based upon the number of conjuncts private final static float readTime =3D .001f; - private final static float procNewRequestTime =3D 100; - private final static float procMoreRequestTime =3D 15; + private final static float procNewRequestTime =3D 100; //TODO: should = come from the connector + private final static float procMoreRequestTime =3D 15; //TODO: should = come from the connector = /** * Calculate cost of a node and all children, recursively from the bot= tom up. @@ -100,10 +100,18 @@ */ static float computeCostForTree(PlanNode node, QueryMetadataInterface = metadata) = throws QueryMetadataException, MetaMatrixComponentException { - = - recursiveComputeCost(node, metadata); - = + Float cost =3D (Float) node.getProperty(NodeConstants.Info.EST_CAR= DINALITY); + + // check if already computed + if(cost =3D=3D null) { + for (PlanNode child : node.getChildren()) { + computeCostForTree(child, metadata); + } + computeNodeCost(node, metadata); + cost =3D (Float) node.getProperty(NodeConstants.Info.EST_CARDI= NALITY); = + } + = if(cost !=3D null) { return cost.floatValue(); } = @@ -112,38 +120,12 @@ } = /** - * This method recursively estimates, from the bottom up, the cost of = each node in - * the plan subtree. If a cost can't be estimated for any node, the w= hole recursive - * operation is aborted. + * This method attempts to estimate a cost for each type of node. * @param node * @param metadata * @throws QueryMetadataException * @throws MetaMatrixComponentException */ - private static void recursiveComputeCost(PlanNode node, QueryMetadataI= nterface metadata) = - throws QueryMetadataException, MetaMatrixComponentException { - = - // check if already computed - if(node.getProperty(NodeConstants.Info.EST_CARDINALITY) !=3D null)= { - return; - } - = - Iterator children =3D node.getChildren().iterator(); - while (children.hasNext()) { - PlanNode child =3D (PlanNode)children.next(); - recursiveComputeCost(child, metadata); - } - computeNodeCost(node, metadata); - } - - /** - * This method attempts to estimate a cost for each type of node - * that can be below an access node at this podouble in planning. - * @param node - * @param metadata - * @throws QueryMetadataException - * @throws MetaMatrixComponentException - */ private static void computeNodeCost(PlanNode node, QueryMetadataInterf= ace metadata) = throws QueryMetadataException, MetaMatrixComponentException { = @@ -182,11 +164,10 @@ = case NodeConstants.Types.PROJECT: { - PlanNode child =3D null; Float childCost =3D null; //Simply record the cost of the only child if (node.getChildCount() !=3D 0) { - child =3D node.getFirstChild(); + PlanNode child =3D node.getFirstChild(); childCost =3D (Float)child.getProperty(NodeConstants.I= nfo.EST_CARDINALITY); } else { childCost =3D new Float(1); @@ -210,7 +191,9 @@ // All rows will be projected so add both costs toget= her. cost +=3D childCost1; } - cost =3D getDistinctEstimate(node, metadata, cost); + if (!node.hasBooleanProperty(NodeConstants.Info.USE_ALL))= { + cost =3D getDistinctEstimate(node, metadata, cost); + } } else { float leftCost =3D (Float)node.getFirstChild().getPropert= y(NodeConstants.Info.EST_CARDINALITY); = leftCost =3D getDistinctEstimate(node.getFirstChild(), me= tadata, leftCost); @@ -279,11 +262,10 @@ } = private static void setCardinalityEstimate(PlanNode node, Float bestEs= timate) { - if (bestEstimate !=3D null){ - node.setProperty(NodeConstants.Info.EST_CARDINALITY, bestEstim= ate); - } else { - node.setProperty(NodeConstants.Info.EST_CARDINALITY, new Float= (UNKNOWN_VALUE)); + if (bestEstimate =3D=3D null){ + bestEstimate =3D Float.valueOf(UNKNOWN_VALUE); } + node.setProperty(NodeConstants.Info.EST_CARDINALITY, bestEstimate); } = /** @@ -559,8 +541,7 @@ private static float estimatePredicateCost(float childCost, PlanNode c= urrentNode, PredicateCriteria predicateCriteria, QueryMetadataInterface met= adata) throws QueryMetadataException, MetaMatrixComponentException { = - HashSet elements =3D new HashSet(); - ElementCollectorVisitor.getElements(predicateCriteria, elements); + Collection elements =3D ElementCollectorVisitor.get= Elements(predicateCriteria, true); = Collection groups =3D GroupsUsedByElementsVisitor.getGroups(predic= ateCriteria); boolean multiGroup =3D groups.size() > 1; @@ -787,7 +768,7 @@ return cost; } = - static boolean usesKey(Collection allElements, Qu= eryMetadataInterface metadata) + static boolean usesKey(Collection allEl= ements, QueryMetadataInterface metadata) throws QueryMetadataException, MetaMatrixComponentException { = if(allElements =3D=3D null || allElements.size() =3D=3D 0) { = @@ -796,9 +777,7 @@ = // Sort elements into groups Map groupMap =3D new HashMap(); - Iterator elementIter =3D allElements.iterator(); - while(elementIter.hasNext()) { = - SingleElementSymbol ses =3D (SingleElementSymbol) elementIter.nex= t(); + for (SingleElementSymbol ses : allElements) { if (!(ses instanceof ElementSymbol)) { continue; } @@ -842,7 +821,7 @@ * @return * @since 4.3 */ - private static float getCardinality(HashSet elements, QueryMetadataInt= erface metadata) = + private static float getCardinality(Collection elements, QueryMetadata= Interface metadata) = throws QueryMetadataException, MetaMatrixComponentException { = if(elements.size() !=3D 1) { @@ -879,7 +858,7 @@ * @return * @since 4.3 */ - private static boolean isNullable(HashSet elements, QueryMetadataInter= face metadata) = + private static boolean isNullable(Collection elements, QueryMetadataIn= terface metadata) = throws QueryMetadataException, MetaMatrixComponentException { = if(elements.size() !=3D 1) { @@ -896,7 +875,7 @@ * @return * @since 4.3 */ - private static float getNNV(HashSet elements, QueryMetadataInterface m= etadata) = + private static float getNNV(Collection elements, QueryMetadataInterfac= e metadata) = throws QueryMetadataException, MetaMatrixComponentException { = if(elements.size() !=3D 1) { @@ -1019,7 +998,7 @@ = independentNode.setProperty(NodeConstants.Info.EST_SET_SIZE, new F= loat(indSymbolNDV)); = - //for non-partitioned joins the cardinatlity of the dependentacces= s should never be greater than the dependent cardinality + //for non-partitioned joins the cardinality of the dependentaccess= should never be greater than the dependent cardinality //TODO: when partitioned joins are implemented, this logic will ne= ed updated float dependentAccessCardinality =3D Math.min(dependentCardinality= , dependentCardinality * indSymbolNDV / depSymbolNDV); = Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relatio= nal/rules/RuleCollapseSource.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/ru= les/RuleCollapseSource.java 2009-07-31 13:15:35 UTC (rev 1210) +++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/ru= les/RuleCollapseSource.java 2009-07-31 15:42:46 UTC (rev 1211) @@ -29,6 +29,7 @@ import com.metamatrix.api.exception.MetaMatrixComponentException; import com.metamatrix.api.exception.query.QueryMetadataException; import com.metamatrix.api.exception.query.QueryPlannerException; +import com.metamatrix.common.types.DataTypeManager; import com.metamatrix.query.analysis.AnalysisRecord; import com.metamatrix.query.metadata.QueryMetadataInterface; import com.metamatrix.query.optimizer.capabilities.CapabilitiesFinder; @@ -96,7 +97,7 @@ } plan =3D removeUnnecessaryInlineView(plan, commandRoot= ); QueryCommand queryCommand =3D createQuery(metadata, ca= pFinder, accessNode, commandRoot); - addSetOpDistinct(metadata, capFinder, accessNode, queryCo= mmand); + addDistinct(metadata, capFinder, accessNode, queryCommand= ); command =3D queryCommand; if (intoGroup !=3D null) { Insert insertCommand =3D new Insert(intoGroup, Resolv= erUtil.resolveElementsInGroup(intoGroup, metadata), null); @@ -112,29 +113,55 @@ return plan; } = - private void addSetOpDistinct(QueryMetadataInterface metadata, + /** + * This functions as "RulePushDistinct", however we do not bother + * checking to see if a parent dup removal can actually be removed + * - which can only happen if there are sources/selects/simple projects/l= imits/order by + * between the access node and the parent dup removal. + * = + * @param metadata + * @param capFinder + * @param accessNode + * @param queryCommand + * @throws QueryMetadataException + * @throws MetaMatrixComponentException + */ + private void addDistinct(QueryMetadataInterface metadata, CapabilitiesFinder capFinder, PlanNode accessNode, QueryCommand queryCommand) throws QueryMetadataException, MetaMatrixComponentException { - if (queryCommand.getLimit() !=3D null && queryCommand.getOrderBy() !=3D = null) { + if (queryCommand.getLimit() !=3D null) { return; //TODO: could create an inline view } - PlanNode parent =3D accessNode.getParent(); - boolean dupRemoval =3D false; - while (parent !=3D null && parent.getType() =3D=3D NodeConstants.Types.S= ET_OP) { - if (!parent.hasBooleanProperty(NodeConstants.Info.USE_ALL)) { - dupRemoval =3D true; - } - parent =3D parent.getParent(); + if (queryCommand.getOrderBy() =3D=3D null) { + /* = + * we're assuming that a pushed order by implies that the cost of the d= istinct operation = + * will be marginal - which is not always true. + * = + * TODO: we should add costing for the benefit of pushing distinct by i= tself + * cardinality without =3D c + * assume cost ~ c lg c for c' cardinality and a modification for assoc= iated bandwidth savings + * recompute cost of processing plan with c' and see if new cost + c lg= c < original cost + */ + return; = } - if (!dupRemoval || NewCalculateCostUtil.usesKey(queryCommand.getProjecte= dSymbols(), metadata)) { + if (RuleRemoveOptionalJoins.useNonDistinctRows(accessNode.getParent())) { return; } - //TODO: we should also order the results and update the set processing l= ogic - // this requires that we can guarantee null ordering + // ensure that all columns are comparable - they might not be if there i= s an intermediate project + for (SingleElementSymbol ses : queryCommand.getProjectedSymbols()) { + if (DataTypeManager.isNonComparable(DataTypeManager.getDataTypeName(ses= .getType()))) { + return; + } + } + /* = + * TODO: if we are under a grouping/union not-all, then we should also f= ully order the results = + * and update the processing logic (this requires that we can guarantee = null ordering) to assume sorted + */ if (queryCommand instanceof SetQuery) { ((SetQuery)queryCommand).setAll(false); - } else if (CapabilitiesUtil.supports(Capability.QUERY_SELECT_DISTINCT, R= uleRaiseAccess.getModelIDFromAccess(accessNode, metadata), metadata, capFin= der)) { + } else if (!NewCalculateCostUtil.usesKey(queryCommand.getProjectedSymbol= s(), metadata) && CapabilitiesUtil.supports(Capability.QUERY_SELECT_DISTINC= T, RuleRaiseAccess.getModelIDFromAccess(accessNode, metadata), metadata, ca= pFinder)) { + //TODO: could check for group by and a select clause containing all gro= up by expressions ((Query)queryCommand).getSelect().setDistinct(true); } } Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relatio= nal/rules/RuleImplementJoinStrategy.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/ru= les/RuleImplementJoinStrategy.java 2009-07-31 13:15:35 UTC (rev 1210) +++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/ru= les/RuleImplementJoinStrategy.java 2009-07-31 15:42:46 UTC (rev 1211) @@ -129,8 +129,7 @@ PlanNode sortNode =3D createSortNode(orderSymbols, outputSymbols, = directions); = if (sourceNode.getType() =3D=3D NodeConstants.Types.ACCESS) { - if (NodeEditor.findAllNodes(sourceNode, NodeConstants.Types.SOURC= E).size() =3D=3D 1 = - && NewCalculateCostUtil.usesKey(expressions, metadata)) { + if (NewCalculateCostUtil.usesKey(expressions, metadata)) { joinNode.setProperty(joinNode.getFirstChild() =3D=3D child= Node ? NodeConstants.Info.IS_LEFT_DISTINCT : NodeConstants.Info.IS_RIGHT_DI= STINCT, true); } if (attemptPush && RuleRaiseAccess.canRaiseOverSort(sourceNode, m= etadata, capFinder, sortNode)) { Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relatio= nal/rules/RulePushAggregates.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/ru= les/RulePushAggregates.java 2009-07-31 13:15:35 UTC (rev 1210) +++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/ru= les/RulePushAggregates.java 2009-07-31 15:42:46 UTC (rev 1211) @@ -175,15 +175,7 @@ } = //check to see if any aggregate is dependent upon cardinality - boolean cardinalityDependent =3D false; - for (AggregateSymbol aggregateSymbol : aggregates) { - if (aggregateSymbol.getAggregateFunction().equals(ReservedWords.COUNT) - || aggregateSymbol.getAggregateFunction().equals(ReservedWords.AVG) - || aggregateSymbol.getAggregateFunction().equals(ReservedWords.SUM)) { - cardinalityDependent =3D true; - break; - } - } + boolean cardinalityDependent =3D RuleRemoveOptionalJoins.areAggregatesCa= rdinalityDependent(aggregates); = LinkedList unionChildren =3D new LinkedList(); findUnionChildren(unionChildren, cardinalityDependent, setOp); Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relatio= nal/rules/RuleRemoveOptionalJoins.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/ru= les/RuleRemoveOptionalJoins.java 2009-07-31 13:15:35 UTC (rev 1210) +++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/ru= les/RuleRemoveOptionalJoins.java 2009-07-31 15:42:46 UTC (rev 1211) @@ -217,7 +217,7 @@ JoinType jt =3D (JoinType)joinNode.getProperty(NodeConstants.Info.= JOIN_TYPE); = if (!optionalNode.hasBooleanProperty(NodeConstants.Info.IS_OPTIONA= L) && = - !(jt =3D=3D JoinType.JOIN_LEFT_OUTER && optionalNode =3D=3D join= Node.getLastChild() && isDistinct(joinNode.getParent()))) { + (jt !=3D JoinType.JOIN_LEFT_OUTER || optionalNode !=3D joinNode.= getLastChild() || useNonDistinctRows(joinNode.getParent()))) { return false; } // remove the parent node and move the sibling node upward @@ -242,31 +242,41 @@ * Ensure that the needed elements come only from the left hand side a= nd = * that cardinality won't matter */ - private boolean isDistinct(PlanNode parent) { + static boolean useNonDistinctRows(PlanNode parent) { while (parent !=3D null) { switch (parent.getType()) { case NodeConstants.Types.DUP_REMOVE: { - return true; + return false; } case NodeConstants.Types.SET_OP: { if (!parent.hasBooleanProperty(NodeConstants.Info.USE_ALL)) { - return true; + return false; } break; } case NodeConstants.Types.GROUP: { Set aggs =3D RulePushAggregates.collectAggregates(pa= rent); - for (AggregateSymbol aggregateSymbol : aggs) { - if (aggregateSymbol.getAggregateFunction().equalsIgnoreCase(Reserved= Words.COUNT) || = - aggregateSymbol.getAggregateFunction().equalsIgnoreCase(ReservedWo= rds.AVG)) { - return false; - } + return areAggregatesCardinalityDependent(aggs); + } + case NodeConstants.Types.TUPLE_LIMIT: { + if (parent.getFirstChild().getType() =3D=3D NodeConstants.Types.SORT)= { + return true; } - return true; } + //we assmue that projects of non-deterministic expressions do not matt= er } parent =3D parent.getParent(); } + return true; + } + + static boolean areAggregatesCardinalityDependent(Set agg= s) { + for (AggregateSymbol aggregateSymbol : aggs) { + if (aggregateSymbol.getAggregateFunction().equalsIgnoreCase(ReservedWor= ds.COUNT) || = + aggregateSymbol.getAggregateFunction().equalsIgnoreCase(ReservedWords= .AVG)) { + return true; + } + } return false; } = Modified: trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestAgg= regatePushdown.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestAggregate= Pushdown.java 2009-07-31 13:15:35 UTC (rev 1210) +++ trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestAggregate= Pushdown.java 2009-07-31 15:42:46 UTC (rev 1211) @@ -205,7 +205,7 @@ ProcessorPlan plan =3D TestOptimizer.helpPlan(sql, = metadata, null, getAggregatesFinder(), - new String[] {"SELECT g_0.p_producti= d AS c_0 FROM m2.product AS g_0 WHERE g_0.p_divid =3D 100 ORDER BY c_0", "S= ELECT g_0.o_productid AS c_0, g_0.o_dealerid AS c_1, SUM(g_0.o_amount) AS c= _2 FROM m1.\"order\" AS g_0, m1.dealer AS g_1 WHERE (g_0.o_dealerid =3D g_1= .d_dealerid) AND (g_1.d_state =3D 'CA') AND (g_0.o_productid IN ()) GROUP BY g_0.o_productid, g_0.o_dealerid ORDER BY c_0"}, //$NON= -NLS-1$ //$NON-NLS-2$ + new String[] {"SELECT DISTINCT g_0.p= _productid AS c_0 FROM m2.product AS g_0 WHERE g_0.p_divid =3D 100 ORDER BY= c_0", "SELECT DISTINCT g_0.o_productid AS c_0, g_0.o_dealerid AS c_1, SUM(= g_0.o_amount) AS c_2 FROM m1.\"order\" AS g_0, m1.dealer AS g_1 WHERE (g_0.= o_dealerid =3D g_1.d_dealerid) AND (g_1.d_state =3D 'CA') AND (g_0.o_produc= tid IN ()) GROUP BY g_0.o_productid, g_0.o_dealerid ORDER= BY c_0"}, //$NON-NLS-1$ //$NON-NLS-2$ TestOptimizer.Comparis= onMode.EXACT_COMMAND_STRING ); = TestOptimizer.checkNodeTypes(plan, new int[] { @@ -235,7 +235,7 @@ ProcessorPlan plan =3D TestOptimizer.helpPlan(sql, = metadata, null, getAggregatesFinder(), - new String[] {"SELECT g_0.p_producti= d AS c_0 FROM m2.product AS g_0 WHERE g_0.p_divid =3D 100 ORDER BY c_0", "S= ELECT g_0.o_productid AS c_0, g_0.o_dealerid AS c_1, MAX(g_0.o_amount) AS c= _2, SUM(g_0.o_amount) AS c_3 FROM m1.\"order\" AS g_0, m1.dealer AS g_1 WHE= RE (g_0.o_dealerid =3D g_1.d_dealerid) AND (g_1.d_state =3D 'CA') AND (g_0.= o_productid IN ()) GROUP BY g_0.o_productid, g_0.o_dealer= id ORDER BY c_0"}, //$NON-NLS-1$ //$NON-NLS-2$ + new String[] {"SELECT DISTINCT g_0.p= _productid AS c_0 FROM m2.product AS g_0 WHERE g_0.p_divid =3D 100 ORDER BY= c_0", "SELECT DISTINCT g_0.o_productid AS c_0, g_0.o_dealerid AS c_1, MAX(= g_0.o_amount) AS c_2, SUM(g_0.o_amount) AS c_3 FROM m1.\"order\" AS g_0, m1= .dealer AS g_1 WHERE (g_0.o_dealerid =3D g_1.d_dealerid) AND (g_1.d_state = =3D 'CA') AND (g_0.o_productid IN ()) GROUP BY g_0.o_prod= uctid, g_0.o_dealerid ORDER BY c_0"}, //$NON-NLS-1$ //$NON-NLS-2$ TestOptimizer.Comparis= onMode.EXACT_COMMAND_STRING ); = TestOptimizer.checkNodeTypes(plan, new int[] { @@ -570,7 +570,7 @@ metadata, null, capFinder, new String[] {"SELECT g_0.MONTH, g_0= .YEAR FROM msModel.\"TIME\" AS g_0 WHERE g_0.YEAR =3D '1999'", //$NON-NLS-1$ - "SELECT g_0.MONTH AS c= _0, g_0.CITY AS c_1, SUM(g_0.SALES) AS c_2 FROM db2model.SALES AS g_0 WHERE= (g_0.MONTH IN ()) AND (g_0.CITY IN ())= GROUP BY g_0.MONTH, g_0.CITY ORDER BY c_0, c_1", //$NON-NLS-1$ = + "SELECT DISTINCT g_0.M= ONTH AS c_0, g_0.CITY AS c_1, SUM(g_0.SALES) AS c_2 FROM db2model.SALES AS = g_0 WHERE (g_0.MONTH IN ()) AND (g_0.CITY IN ()) GROUP BY g_0.MONTH, g_0.CITY ORDER BY c_0, c_1", //$NON-NLS-1$ = "SELECT g_0.CITY, g_0.= REGION FROM oraclemodel.GEOGRAPHY AS g_0 WHERE g_0.REGION IN ('BORDEAUX', '= POLINESIA')"}, //$NON-NLS-1$ ComparisonMode.EXACT_COMMAND_STRING = ); = @@ -618,7 +618,7 @@ metadata, null, capFinder, new String[] {"SELECT g_0.MONTH, g_0= .YEAR FROM msModel.\"TIME\" AS g_0 WHERE g_0.YEAR =3D '1999'", //$NON-NLS-1$ - "SELECT g_0.MONTH AS c_0, g_0.CI= TY AS c_1, SUM(g_0.SALES) AS c_2 FROM db2model.SALES AS g_0 WHERE (g_0.MONT= H IN ()) AND (g_0.CITY IN ()) GROUP BY = g_0.MONTH, g_0.CITY ORDER BY c_0, c_1", //$NON-NLS-1$ = + "SELECT DISTINCT g_0.MONTH AS c_= 0, g_0.CITY AS c_1, SUM(g_0.SALES) AS c_2 FROM db2model.SALES AS g_0 WHERE = (g_0.MONTH IN ()) AND (g_0.CITY IN ()) = GROUP BY g_0.MONTH, g_0.CITY ORDER BY c_0, c_1", //$NON-NLS-1$ = "SELECT g_0.CITY, g_0.REGION FRO= M oraclemodel.GEOGRAPHY AS g_0 WHERE g_0.REGION IN ('BORDEAUX', 'POLINESIA'= )"}, //$NON-NLS-1$ ComparisonMode.EXACT_COMMAND_STRING = ); = @@ -665,7 +665,7 @@ ProcessorPlan plan =3D helpPlan(sql, = metadata, null, capFinder, - new String[] {"SELECT g_0.MONTH AS c= _0, g_1.REGION AS c_1, SUM(g_0.SALES) AS c_2 FROM db2model.SALES AS g_0, db= 2model.GEOGRAPHY2 AS g_1 WHERE (g_0.CITY =3D g_1.CITY) AND (g_1.REGION IN (= 'BORDEAUX', 'POLINESIA')) AND (g_0.MONTH IN ()) GROUP BY = g_0.MONTH, g_1.REGION ORDER BY c_0", //$NON-NLS-1$ = + new String[] {"SELECT DISTINCT g_0.M= ONTH AS c_0, g_1.REGION AS c_1, SUM(g_0.SALES) AS c_2 FROM db2model.SALES A= S g_0, db2model.GEOGRAPHY2 AS g_1 WHERE (g_0.CITY =3D g_1.CITY) AND (g_1.RE= GION IN ('BORDEAUX', 'POLINESIA')) AND (g_0.MONTH IN ()) = GROUP BY g_0.MONTH, g_1.REGION ORDER BY c_0", //$NON-NLS-1$ = "SELECT g_0.MONTH AS c= _0, g_0.YEAR AS c_1 FROM msModel.\"TIME\" AS g_0 WHERE g_0.YEAR =3D '1999' = ORDER BY c_0"}, //$NON-NLS-1$ ComparisonMode.EXACT_C= OMMAND_STRING ); = @@ -709,7 +709,7 @@ metadata, null, capFinder, new String[] {"SELECT c2, c1, c0 FRO= M db2model.DB2TABLE", //$NON-NLS-1$ - "SELECT b2, sum(b0) FR= OM oraclemodel.OraTable GROUP BY b2 ORDER BY b2"}, //$NON-NLS-1$ + "SELECT DISTINCT b2, s= um(b0) FROM oraclemodel.OraTable GROUP BY b2 ORDER BY b2"}, //$NON-NLS-1$ SHOULD_SUCCEED ); = checkNodeTypes(plan, new int[] { @@ -791,8 +791,8 @@ capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$ = ProcessorPlan plan =3D TestOptimizer.helpPlan("select count(e2) fr= om (select e1, e2 from pm1.g1 union select e1, e2 from pm1.g2) z", FakeMeta= dataFactory.example1Cached(), null, capFinder, //$NON-NLS-1$ - new String[]{"SELECT DISTINCT g_0.e1, g_0.e2 FROM pm1.g2 AS g_= 0", //$NON-NLS-1$ - "SELECT DISTINCT g_0.e1, g_0.e2 FROM pm1.g1 AS g_0"}, ComparisonM= ode.EXACT_COMMAND_STRING); //$NON-NLS-1$ + new String[]{"SELECT g_0.e1, g_0.e2 FROM pm1.g2 AS g_0", //$NO= N-NLS-1$ + "SELECT g_0.e1, g_0.e2 FROM pm1.g1 AS g_0"}, ComparisonMode.EXACT= _COMMAND_STRING); //$NON-NLS-1$ TestOptimizer.checkNodeTypes(plan, new int[] { 2, // Access 0, // DependentAccess Modified: trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOpt= imizer.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptimizer= .java 2009-07-31 13:15:35 UTC (rev 1210) +++ trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptimizer= .java 2009-07-31 15:42:46 UTC (rev 1211) @@ -902,28 +902,28 @@ public void testPushingCriteriaThroughUnion1() { = helpPlan("select e1 from vm1.u1 where e1=3D'abc'", example1(), //$NON= -NLS-1$ new String[] { "SELECT pm1.g3.e1, pm1.g3.e2, pm1.g3.e3, pm1.g3.e4 FROM = pm1.g3 WHERE pm1.g3.e1 =3D 'abc'", //$NON-NLS-1$ - "SELECT DISTINCT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4 FROM pm= 1.g2 WHERE pm1.g2.e1 =3D 'abc'", //$NON-NLS-1$ - "SELECT DISTINCT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm= 1.g1 WHERE pm1.g1.e1 =3D 'abc'" } ); //$NON-NLS-1$ + "SELECT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4 FROM pm1.g2 WHER= E pm1.g2.e1 =3D 'abc'", //$NON-NLS-1$ + "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1 WHER= E pm1.g1.e1 =3D 'abc'" } ); //$NON-NLS-1$ } = public void testPushingCriteriaThroughUnion2() { = helpPlan("select e1 from vm1.u2 where e1=3D'abc'", example1(), //$NON= -NLS-1$ - new String[] { "SELECT DISTINCT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2= .e4 FROM pm1.g2 WHERE pm1.g2.e1 =3D 'abc'", //$NON-NLS-1$ - "SELECT DISTINCT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm= 1.g1 WHERE pm1.g1.e1 =3D 'abc'" } ); //$NON-NLS-1$ + new String[] { "SELECT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4 FROM = pm1.g2 WHERE pm1.g2.e1 =3D 'abc'", //$NON-NLS-1$ + "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1 WHER= E pm1.g1.e1 =3D 'abc'" } ); //$NON-NLS-1$ } = public void testPushingCriteriaThroughUnion3() { = helpPlan("select e1 from vm1.u1 where e1=3D'abc' and e2=3D5", example= 1(), //$NON-NLS-1$ new String[] { "SELECT pm1.g3.e1, pm1.g3.e2, pm1.g3.e3, pm1.g3.e4 FROM = pm1.g3 WHERE (pm1.g3.e1 =3D 'abc') AND (pm1.g3.e2 =3D 5)", //$NON-NLS-1$ - "SELECT DISTINCT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4 FROM pm= 1.g2 WHERE (pm1.g2.e1 =3D 'abc') AND (pm1.g2.e2 =3D 5)", //$NON-NLS-1$ - "SELECT DISTINCT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm= 1.g1 WHERE (pm1.g1.e1 =3D 'abc') AND (pm1.g1.e2 =3D 5)" } ); //$NON-NLS-1$ + "SELECT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4 FROM pm1.g2 WHER= E (pm1.g2.e1 =3D 'abc') AND (pm1.g2.e2 =3D 5)", //$NON-NLS-1$ + "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1 WHER= E (pm1.g1.e1 =3D 'abc') AND (pm1.g1.e2 =3D 5)" } ); //$NON-NLS-1$ } = public void testPushingCriteriaThroughUnion4() { = helpPlan("select e1 from vm1.u1 where e1=3D'abc' or e2=3D5", example1= (), //$NON-NLS-1$ new String[] { "SELECT pm1.g3.e1, pm1.g3.e2, pm1.g3.e3, pm1.g3.e4 FROM = pm1.g3 WHERE (pm1.g3.e1 =3D 'abc') OR (pm1.g3.e2 =3D 5)", //$NON-NLS-1$ - "SELECT DISTINCT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm= 1.g1 WHERE (pm1.g1.e1 =3D 'abc') OR (pm1.g1.e2 =3D 5)", //$NON-NLS-1$ - "SELECT DISTINCT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4 FROM pm= 1.g2 WHERE (pm1.g2.e1 =3D 'abc') OR (pm1.g2.e2 =3D 5)" } ); //$NON-NLS-1$ + "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1 WHER= E (pm1.g1.e1 =3D 'abc') OR (pm1.g1.e2 =3D 5)", //$NON-NLS-1$ + "SELECT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4 FROM pm1.g2 WHER= E (pm1.g2.e1 =3D 'abc') OR (pm1.g2.e2 =3D 5)" } ); //$NON-NLS-1$ } = // expression in a subquery of the union @@ -992,8 +992,8 @@ ProcessorPlan plan =3D helpPlan("select vm1.u1.e1 from vm1.u1, pm1.g1= where vm1.u1.e1=3D'abc' and vm1.u1.e1=3Dpm1.g1.e1", example1(), //$NON-NLS= -1$ new String[] { "SELECT pm1.g1.e1 FROM pm1.g1 WHERE pm1.g1.e1 =3D 'abc'"= , //$NON-NLS-1$ "SELECT pm1.g3.e1, pm1.g3.e2, pm1.g3.e3, pm1.g= 3.e4 FROM pm1.g3 WHERE pm1.g3.e1 =3D 'abc'", //$NON-NLS-1$ - "SELECT DISTINCT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4 FROM pm= 1.g2 WHERE pm1.g2.e1 =3D 'abc'", //$NON-NLS-1$ - "SELECT DISTINCT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm= 1.g1 WHERE pm1.g1.e1 =3D 'abc'" } ); //$NON-NLS-1$ + "SELECT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4 FROM pm1.g2 WHER= E pm1.g2.e1 =3D 'abc'", //$NON-NLS-1$ + "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1 WHER= E pm1.g1.e1 =3D 'abc'" } ); //$NON-NLS-1$ checkNodeTypes(plan, new int[] { 4, // Access 0, // DependentAccess @@ -1137,8 +1137,8 @@ = public void testDefect5283() { = helpPlan("select * from vm1.a6", example1(), //$NON-NLS-1$ - new String[] { "SELECT DISTINCT pm1.g1.e1, pm1.g1.e2, pm1.g1.e= 3, pm1.g1.e4 FROM pm1.g1", //$NON-NLS-1$ - "SELECT DISTINCT pm1.g2.e1, pm1.g2.e2, pm1.g2.= e3, pm1.g2.e4 FROM pm1.g2" } ); //$NON-NLS-1$ + new String[] { "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1= .e4 FROM pm1.g1", //$NON-NLS-1$ + "SELECT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g= 2.e4 FROM pm1.g2" } ); //$NON-NLS-1$ } = public void testManyJoinsOverThreshold() throws Exception { Modified: trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOpt= ionalJoins.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptionalJ= oins.java 2009-07-31 13:15:35 UTC (rev 1210) +++ trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptionalJ= oins.java 2009-07-31 15:42:46 UTC (rev 1211) @@ -22,15 +22,15 @@ = package com.metamatrix.query.optimizer; = -import junit.framework.TestCase; +import org.junit.Test; = import com.metamatrix.query.optimizer.TestOptimizer.ComparisonMode; import com.metamatrix.query.processor.ProcessorPlan; import com.metamatrix.query.unittest.FakeMetadataFactory; = -public class TestOptionalJoins extends TestCase { +public class TestOptionalJoins { = - public void testOptionalJoinNode1() { = + @Test public void testOptionalJoinNode1() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g1.e1 FR= OM pm1.g1, /* optional */ pm1.g2", FakeMetadataFactory.example1Cached(), //= $NON-NLS-1$ new String[] {"SELECT pm1.g1.e1 FROM pm1.g1"} ); //$NON-NLS-1$ = @@ -39,7 +39,7 @@ TestOptimizer.checkSubPlanCount(plan, 0); } = - public void testOptionalJoinNode1_1() { = + @Test public void testOptionalJoinNode1_1() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g1.e1,pm= 2.g2.e1 FROM pm1.g1, /* optional */ pm2.g2", FakeMetadataFactory.example1C= ached(), //$NON-NLS-1$ new String[] {"SELECT pm1.g1.e1 FROM pm1.g1", "SELECT pm2.g2.e= 1 FROM pm2.g2"} ); //$NON-NLS-1$//$NON-NLS-2$ = @@ -63,21 +63,21 @@ TestOptimizer.checkSubPlanCount(plan, 0); } = - public void testOptionalJoinNode2() { = + @Test public void testOptionalJoinNode2() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g1.e1 FR= OM pm1.g1, /* optional */ pm1.g2, pm1.g3", FakeMetadataFactory.example1Cach= ed(), //$NON-NLS-1$ new String[] {"SELECT g_0.e1 FROM pm1.g1 AS g_0, pm1.g3 AS g_1= "} ); //$NON-NLS-1$ = TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN); = = } = - public void testOptionalJoinNode3() { = + @Test public void testOptionalJoinNode3() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g1.e1 FR= OM pm1.g1 LEFT OUTER JOIN /* optional */ pm1.g2 on pm1.g1.e1 =3D pm1.g2.e1"= , FakeMetadataFactory.example1Cached(), //$NON-NLS-1$ new String[] {"SELECT pm1.g1.e1 FROM pm1.g1"} ); //$NON-NLS-1$ = TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN); = = } = - public void testOptionalJoinNode3_1() { = + @Test public void testOptionalJoinNode3_1() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g1.e1, p= m2.g2.e1 FROM pm1.g1 LEFT OUTER JOIN /* optional */ pm2.g2 on pm1.g1.e1 =3D= pm2.g2.e1", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$ new String[] {"SELECT g_0.e1 AS c_0 FROM pm2.g2 AS g_0 ORDER B= Y c_0", "SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0 ORDER BY c_0"} ); //$NON-N= LS-1$ //$NON-NLS-2$ = @@ -101,49 +101,49 @@ TestOptimizer.checkSubPlanCount(plan, 0); } = - public void testOptionalJoinNode4() { = + @Test public void testOptionalJoinNode4() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g1.e1 FR= OM (pm1.g1 LEFT OUTER JOIN /* optional */ pm1.g2 on pm1.g1.e1 =3D pm1.g2.e1= ) LEFT OUTER JOIN /* optional */ pm1.g3 on pm1.g1.e1 =3D pm1.g3.e1", FakeMe= tadataFactory.example1Cached(), //$NON-NLS-1$ new String[] {"SELECT pm1.g1.e1 FROM pm1.g1"} ); //$NON-NLS-1$ = TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN); = = } = - public void testOptionalJoinNode5() { = + @Test public void testOptionalJoinNode5() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g1.e1 FR= OM (pm1.g1 LEFT OUTER JOIN pm1.g2 on pm1.g1.e1 =3D pm1.g2.e1) LEFT OUTER JO= IN /* optional */ pm1.g3 on pm1.g1.e1 =3D pm1.g3.e1", FakeMetadataFactory.e= xample1Cached(), //$NON-NLS-1$ new String[] {"SELECT g_0.e1 FROM pm1.g1 AS g_0 LEFT OUTER JOI= N pm1.g2 AS g_1 ON g_0.e1 =3D g_1.e1"} ); //$NON-NLS-1$ = TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN); = = } = - public void testOptionalJoinNode6() { = + @Test public void testOptionalJoinNode6() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g1.e1 FR= OM (pm1.g1 LEFT OUTER JOIN /* optional */ pm1.g2 on pm1.g1.e1 =3D pm1.g2.e1= ) LEFT OUTER JOIN pm1.g3 on pm1.g1.e1 =3D pm1.g3.e1", FakeMetadataFactory.e= xample1Cached(), //$NON-NLS-1$ new String[] {"SELECT g_0.e1 FROM pm1.g1 AS g_0 LEFT OUTER JOI= N pm1.g3 AS g_1 ON g_0.e1 =3D g_1.e1"} ); //$NON-NLS-1$ = TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN); = = } = - public void testOptionalJoinNode7() { = + @Test public void testOptionalJoinNode7() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g3.e1 FR= OM /* optional */ (pm1.g1 LEFT OUTER JOIN pm1.g2 on pm1.g1.e1 =3D pm1.g2.e1= ) LEFT OUTER JOIN pm1.g3 on pm1.g1.e1 =3D pm1.g3.e1", FakeMetadataFactory.e= xample1Cached(), //$NON-NLS-1$ new String[] {"SELECT pm1.g3.e1 FROM pm1.g3"} ); //$NON-NLS-1$ = TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN); = = } = - public void testOptionalJoinNode8() { = + @Test public void testOptionalJoinNode8() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g1.e1 FR= OM pm1.g1 LEFT OUTER JOIN /* optional */ (select * from pm1.g2) as X on pm1= .g1.e1 =3D x.e1", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$ new String[] {"SELECT pm1.g1.e1 FROM pm1.g1"} ); //$NON-NLS-1$ = TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN); = = } = - public void testOptionalJoinNode9() { = + @Test public void testOptionalJoinNode9() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g2.e1 FR= OM pm1.g2, /* optional */ vm1.g1", FakeMetadataFactory.example1Cached(), //= $NON-NLS-1$ new String[] {"SELECT pm1.g2.e1 FROM pm1.g2"} ); //$NON-NLS-1$ = TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN); = = } = - public void testOptionalJoinNode10() { = + @Test public void testOptionalJoinNode10() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g1.e1 FR= OM /* optional */ vm1.g1, pm1.g1", FakeMetadataFactory.example1Cached(), //= $NON-NLS-1$ new String[] {"SELECT pm1.g1.e1 FROM pm1.g1"} ); //$NON-NLS-1$ = @@ -152,7 +152,7 @@ TestOptimizer.checkSubPlanCount(plan, 0); } = - public void testOptionalJoinNode11() { = + @Test public void testOptionalJoinNode11() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g1.e1 FR= OM pm1.g1 LEFT OUTER JOIN /* optional */ vm1.g2 on pm1.g1.e1 =3D vm1.g2.e1"= , FakeMetadataFactory.example1Cached(), //$NON-NLS-1$ new String[] {"SELECT pm1.g1.e1 FROM pm1.g1"} ); //$NON-NLS-1$ = @@ -161,7 +161,7 @@ TestOptimizer.checkSubPlanCount(plan, 0); } = - public void testOptionalJoinNode12() { = + @Test public void testOptionalJoinNode12() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g3.e1 FR= OM /* optional */ (pm1.g1 LEFT OUTER JOIN vm1.g1 on pm1.g1.e1 =3D vm1.g1.e1= ) LEFT OUTER JOIN pm1.g3 on pm1.g1.e1 =3D pm1.g3.e1", FakeMetadataFactory.e= xample1Cached(), //$NON-NLS-1$ new String[] {"SELECT pm1.g3.e1 FROM pm1.g3"} ); //$NON-NLS-1$ = @@ -170,7 +170,7 @@ TestOptimizer.checkSubPlanCount(plan, 0); } = - public void testOptionalJoinNode13() { = + @Test public void testOptionalJoinNode13() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT count(pm1.g1= .e1) FROM pm1.g1 LEFT OUTER JOIN /* optional */ pm1.g2 on pm1.g1.e1 =3D pm1= .g2.e1", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$ new String[] {"SELECT pm1.g1.e1 FROM pm1.g1"} ); //$NON-NLS-1$ = @@ -197,9 +197,9 @@ /** * The distinct prevents the removal of the optional join = */ - public void testOptionalJoinNode14() throws Exception { = + @Test public void testOptionalJoinNode14() throws Exception { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT ve1 FROM vm1= .g4", FakeMetadataFactory.example4(), //$NON-NLS-1$ - new String[] {"SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0 WHERE g= _0.e1 IN () ORDER BY c_0", "SELECT g_0.e1 AS c_0 FROM pm1= .g2 AS g_0 ORDER BY c_0"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRIN= G ); //$NON-NLS-1$ //$NON-NLS-2$ + new String[] {"SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0 WHERE g= _0.e1 IN () ORDER BY c_0", "SELECT DISTINCT g_0.e1 AS c_0= FROM pm1.g2 AS g_0 ORDER BY c_0"}, TestOptimizer.ComparisonMode.EXACT_COMM= AND_STRING ); //$NON-NLS-1$ //$NON-NLS-2$ = TestOptimizer.checkNodeTypes(plan, new int[] { 1, // Access @@ -221,7 +221,7 @@ TestOptimizer.checkSubPlanCount(plan, 0); } = - public void testOptionalJoinNode15() { = + @Test public void testOptionalJoinNode15() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT x.e1 FROM (s= elect vm1.g1.e1, vm1.g2.e2 from vm1.g1 LEFT OUTER JOIN /* optional */vm1.g2= on vm1.g1.e2 =3D vm1.g2.e2) AS x", FakeMetadataFactory.example1Cached(), /= /$NON-NLS-1$ new String[] {"SELECT pm1.g1.e1 FROM pm1.g1"} ); //$NON-NLS-1$ = @@ -230,7 +230,7 @@ TestOptimizer.checkSubPlanCount(plan, 0); } = - public void testOptionalJoinNode16() { = + @Test public void testOptionalJoinNode16() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT length(z) FR= OM /* optional */ pm1.g1, (select distinct e2 as y, e3 || 'x' as z from pm1= .g1 ORDER BY y, z) AS x", FakeMetadataFactory.example1Cached(), //$NON-NLS-= 1$ new String[] {"SELECT e2, e3 FROM pm1.g1"} ); //$NON-NLS-1$ = @@ -254,7 +254,7 @@ TestOptimizer.checkSubPlanCount(plan, 0); } = - public void testOptionalJoinNode17() { = + @Test public void testOptionalJoinNode17() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT length(z) FR= OM /* optional */ pm1.g1 inner join (select e2 as y, e3 || 'x' as z from pm= 1.g1 ORDER BY z) AS x on pm1.g1.e2=3Dx.y", FakeMetadataFactory.example1Cach= ed(), //$NON-NLS-1$ new String[] {"SELECT e3 FROM pm1.g1"} ); //$NON-NLS-1$ = @@ -278,16 +278,16 @@ TestOptimizer.checkSubPlanCount(plan, 0); } = - public void testOptionalJoinWithIntersection() throws Exception { = + @Test public void testOptionalJoinWithIntersection() throws Exception = { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g3.e1 FR= OM pm1.g3 inner join (select pm1.g1.e2 as y from /* optional */ pm1.g1 inne= r join pm1.g2 on pm1.g1.e1 =3D pm1.g2.e1) AS x on pm1.g3.e2=3Dx.y", FakeMet= adataFactory.example1Cached(), //$NON-NLS-1$ new String[] {"SELECT g_0.e1 FROM pm1.g3 AS g_0, pm1.g1 AS g_1= , pm1.g2 AS g_2 WHERE (g_1.e1 =3D g_2.e1) AND (g_0.e2 =3D g_1.e2)"}, Compar= isonMode.EXACT_COMMAND_STRING ); //$NON-NLS-1$ = = TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN); = = } = - public void testOptionalJoinWithNestedOrderBy() { = + @Test public void testOptionalJoinWithNestedOrderBy() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g3.e1 FR= OM pm1.g3 inner join (select pm1.g2.e1, pm1.g1.e2 as y from /* optional */ = pm1.g1 inner join pm1.g2 on pm1.g1.e1 =3D pm1.g2.e1 order by pm1.g2.e1 limi= t 10000) AS x on pm1.g3.e2=3Dx.y", FakeMetadataFactory.example1Cached(), //= $NON-NLS-1$ - new String[] {"SELECT g_0.e2 AS c_0, g_0.e1 AS c_1 FROM pm1.g3= AS g_0 ORDER BY c_0", "SELECT g_0.e2 AS c_0, g_1.e1 AS c_1 FROM pm1.g1 AS = g_0, pm1.g2 AS g_1 WHERE g_0.e1 =3D g_1.e1 ORDER BY c_1"} ); //$NON-NLS-1$ = //$NON-NLS-2$ //$NON-NLS-3$ + new String[] {"SELECT g_0.e2 AS c_0, g_0.e1 AS c_1 FROM pm1.g3= AS g_0 ORDER BY c_0", "SELECT g_0.e2 AS c_0, g_1.e1 AS c_1 FROM pm1.g1 AS = g_0, pm1.g2 AS g_1 WHERE g_0.e1 =3D g_1.e1 ORDER BY c_1"} ); //$NON-NLS-1$ = //$NON-NLS-2$ = = TestOptimizer.checkNodeTypes(plan, new int[] { 2, // Access @@ -312,7 +312,7 @@ /** * Grouping will prevent the removal from happening = */ - public void testOptionalJoinWithGroupingOverAllColumns() { = + @Test public void testOptionalJoinWithGroupingOverAllColumns() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT pm1.g3.e1 FR= OM pm1.g3, (select max(pm1.g1.e4) y from /* optional */ pm1.g1, pm1.g2 wher= e pm1.g1.e1 =3D pm1.g2.e1) AS x where pm1.g3.e2=3Dx.y", FakeMetadataFactory= .example1Cached(), //$NON-NLS-1$ new String[] {"SELECT g_0.e2, g_0.e1 FROM pm1.g3 AS g_0", "SEL= ECT g_0.e4 FROM pm1.g1 AS g_0, pm1.g2 AS g_1 WHERE g_0.e1 =3D g_1.e1"} ); /= /$NON-NLS-1$ //$NON-NLS-2$ = @@ -339,7 +339,7 @@ /** * Union should prevent the removal from happening = */ - public void testOptionalJoinWithUnion() { = + @Test public void testOptionalJoinWithUnion() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("select pm1.g2.e4 fr= om /* optional */ pm1.g1 inner join pm1.g2 on pm1.g1.e1 =3D pm1.g2.e1 union= all select convert(pm1.g2.e2, double) from /* optional */ pm1.g1 inner joi= n pm1.g2 on pm1.g1.e1 =3D pm1.g2.e1", FakeMetadataFactory.example1Cached(),= //$NON-NLS-1$ new String[] {"SELECT pm1.g2.e4 FROM pm1.g2", "SELECT pm1.g2.e= 2 FROM pm1.g2"} ); //$NON-NLS-1$ //$NON-NLS-2$ = @@ -363,7 +363,7 @@ TestOptimizer.checkSubPlanCount(plan, 0); } = - public void testOptionalJoinWithCompoundCriteria() { = + @Test public void testOptionalJoinWithCompoundCriteria() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT length(z) FR= OM /* optional */ pm1.g1 inner join (select e2 as y, e3 || 'x' as z from pm= 1.g1 ORDER BY z) AS x on pm1.g1.e2=3Dx.y and concat(x.y, x.z) =3D '1'", Fak= eMetadataFactory.example1Cached(), //$NON-NLS-1$ new String[] {"SELECT e3 FROM pm1.g1"} ); //$NON-NLS-1$ = @@ -387,9 +387,9 @@ TestOptimizer.checkSubPlanCount(plan, 0); } = - public void testOptionalJoinWithDupRemoval() { = + @Test public void testOptionalJoinWithDupRemoval() { = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT a.e1 from (S= ELECT distinct pm1.g1.e1, x.y FROM pm1.g1, /* optional */ (select e2 as y, = e3 || 'x' as z from pm1.g1 ORDER BY z) AS x where pm1.g1.e2=3Dx.y) as a", F= akeMetadataFactory.example1Cached(), //$NON-NLS-1$ - new String[] {"SELECT g_0.e2 AS c_0 FROM pm1.g1 AS g_0 ORDER B= Y c_0", "SELECT g_0.e2 AS c_0, g_0.e1 AS c_1 FROM pm1.g1 AS g_0 ORDER BY c_= 0"} ); //$NON-NLS-1$ //$NON-NLS-2$ + new String[] {"SELECT DISTINCT g_0.e2 AS c_0 FROM pm1.g1 AS g_= 0 ORDER BY c_0", "SELECT DISTINCT g_0.e2 AS c_0, g_0.e1 AS c_1 FROM pm1.g1 = AS g_0 ORDER BY c_0"} ); //$NON-NLS-1$ //$NON-NLS-2$ = TestOptimizer.checkNodeTypes(plan, new int[] { 2, // Access @@ -415,7 +415,7 @@ * Cross Joins do not allow for join removal * This could be optimized though as an exists predicate */ - public void testOptionalJoinWithoutHint_crossJoin() { + @Test public void testOptionalJoinWithoutHint_crossJoin() { ProcessorPlan plan =3D TestOptimizer .helpPlan( "SELECT distinct pm1.g1.e1 from pm1.g1, pm1.g2", FakeMetadataFactory= .example1Cached(), //$NON-NLS-1$ @@ -424,7 +424,7 @@ TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN); } = - public void testOptionalJoinWithoutHint_outerJoin() { + @Test public void testOptionalJoinWithoutHint_outerJoin() { ProcessorPlan plan =3D TestOptimizer .helpPlan( "SELECT distinct pm1.g1.e2 from pm1.g1 left outer join pm1.g2 on (pm= 1.g1.e1 =3D pm1.g2.e1)", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$ @@ -433,7 +433,7 @@ TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN); } = - public void testOptionalJoinWithoutHint_aggregate() { + @Test public void testOptionalJoinWithoutHint_aggregate() { ProcessorPlan plan =3D TestOptimizer .helpPlan( "SELECT pm1.g1.e3, max(pm1.g1.e2) from pm1.g1 left outer join pm1.g2= on (pm1.g1.e1 =3D pm1.g2.e1) group by pm1.g1.e3", FakeMetadataFactory.exam= ple1Cached(), //$NON-NLS-1$ @@ -462,7 +462,7 @@ /** * The average agg will prevent the join removal */ - public void testOptionalJoinWithoutHint_aggregate1() { + @Test public void testOptionalJoinWithoutHint_aggregate1() { ProcessorPlan plan =3D TestOptimizer .helpPlan( "SELECT pm1.g1.e3, avg(pm1.g1.e2) from pm1.g1 left outer join pm1.g2= on (pm1.g1.e1 =3D pm1.g2.e1) group by pm1.g1.e3", FakeMetadataFactory.exam= ple1Cached(), //$NON-NLS-1$ @@ -488,7 +488,7 @@ TestOptimizer.checkSubPlanCount(plan, 0); } = - public void testOptionalJoinWithoutHint_union() { + @Test public void testOptionalJoinWithoutHint_union() { ProcessorPlan plan =3D TestOptimizer .helpPlan( "SELECT pm1.g1.e3 from pm1.g1 left outer join pm1.g2 on (pm1.g1.e1 = =3D pm1.g2.e1) union select 1", FakeMetadataFactory.example1Cached(), //$NO= N-NLS-1$ @@ -514,4 +514,30 @@ TestOptimizer.checkSubPlanCount(plan, 0); } = + @Test public void testOptionalJoinWithOrderedLimit() { + ProcessorPlan plan =3D TestOptimizer + .helpPlan( + "select distinct * from (SELECT pm1.g1.e3 from pm1.g1 left outer joi= n pm1.g2 on (pm1.g1.e1 =3D pm1.g2.e1) order by e3 limit 10) x", FakeMetadat= aFactory.example1Cached(), //$NON-NLS-1$ + new String[] { "SELECT DISTINCT g_0.e3 AS c_0 FROM pm1.g1 AS g_0 LEF= T OUTER JOIN pm1.g2 AS g_1 ON g_0.e1 =3D g_1.e1 ORDER BY c_0" }); //$NON-NL= S-1$ + + TestOptimizer.checkNodeTypes(plan, new int[] { = + 1, // Access + 0, // DependentAccess + 0, // DependentSelect + 0, // DependentProject + 1, // DupRemove + 0, // Grouping + 0, // Join + 0, // MergeJoin + 0, // Null + 0, // PlanExecution + 1, // Project + 0, // Select + 0, // Sort + 0 // UnionAll + }); + + TestOptimizer.checkSubPlanCount(plan, 0); + } + = } Modified: trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestSto= redProcedurePlanning.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestStoredPro= cedurePlanning.java 2009-07-31 13:15:35 UTC (rev 1210) +++ trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestStoredPro= cedurePlanning.java 2009-07-31 15:42:46 UTC (rev 1211) @@ -298,7 +298,7 @@ = public void testStoredQuery22() { ProcessorPlan plan =3D TestOptimizer.helpPlan("select e1 from (EXE= C pm1.sq1()) as x where e1=3D'a' union (select e1 from vm1.g2 where e1=3D'b= ')", new TempMetadataAdapter(FakeMetadataFactory.example1Cached(), new Temp= MetadataStore()), //$NON-NLS-1$ - new String[] { "SELECT DISTINCT g_0.e1 FROM pm1.g1 AS g_0 WHER= E g_0.e1 =3D 'a'", "SELECT DISTINCT g_0.e1 FROM pm1.g1 AS g_0, pm1.g2 AS g_= 1 WHERE (g_0.e1 =3D g_1.e1) AND (g_0.e1 =3D 'b') AND (g_1.e1 =3D 'b')" }); = //$NON-NLS-1$ //$NON-NLS-2$ + new String[] { "SELECT g_0.e1 FROM pm1.g1 AS g_0 WHERE g_0.e1 = =3D 'a'", "SELECT g_0.e1 FROM pm1.g1 AS g_0, pm1.g2 AS g_1 WHERE (g_0.e1 = =3D g_1.e1) AND (g_0.e1 =3D 'b') AND (g_1.e1 =3D 'b')" }); //$NON-NLS-1$ //= $NON-NLS-2$ = TestOptimizer.checkNodeTypes(plan, new int[] { 2, // Access Modified: trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestUni= onPlanning.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestUnionPlan= ning.java 2009-07-31 13:15:35 UTC (rev 1210) +++ trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestUnionPlan= ning.java 2009-07-31 15:42:46 UTC (rev 1211) @@ -73,7 +73,7 @@ capFinder.addCapabilities("BQT2", caps); //$NON-NLS-1$ = ProcessorPlan plan =3D TestOptimizer.helpPlan("SELECT IntKey FROM = BQT1.SmallA UNION SELECT IntNum FROM BQT2.SmallA UNION ALL SELECT IntNum FR= OM BQT1.SmallA", FakeMetadataFactory.exampleBQTCached(), null, capFinder,//= $NON-NLS-1$ - new String[] { "SELECT DISTINCT IntNum FROM BQT2.SmallA", "SEL= ECT DISTINCT IntKey FROM BQT1.SmallA", "SELECT IntNum FROM BQT1.SmallA" }, = TestOptimizer.SHOULD_SUCCEED); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ = + new String[] { "SELECT IntNum FROM BQT2.SmallA", "SELECT IntKe= y FROM BQT1.SmallA", "SELECT IntNum FROM BQT1.SmallA" }, TestOptimizer.SHOU= LD_SUCCEED); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ = = TestOptimizer.checkNodeTypes(plan, new int[] { 3, // Access Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/TestSet= Processing.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/engine/src/test/java/com/metamatrix/query/processor/TestSetProces= sing.java 2009-07-31 13:15:35 UTC (rev 1210) +++ trunk/engine/src/test/java/com/metamatrix/query/processor/TestSetProces= sing.java 2009-07-31 15:42:46 UTC (rev 1211) @@ -35,7 +35,7 @@ public void testExcept() { String sql =3D "select e1, e2 from pm1.g2 except select e1, 1 from= pm1.g2"; //$NON-NLS-1$ = - ProcessorPlan plan =3D TestOptimizer.helpPlan(sql, FakeMetadataFac= tory.example1Cached(), new String[] {"SELECT g_0.e1 FROM pm1.g2 AS g_0", "S= ELECT DISTINCT g_0.e1, g_0.e2 FROM pm1.g2 AS g_0"}); //$NON-NLS-1$ //$NON-= NLS-2$ + ProcessorPlan plan =3D TestOptimizer.helpPlan(sql, FakeMetadataFac= tory.example1Cached(), new String[] {"SELECT g_0.e1 FROM pm1.g2 AS g_0", "S= ELECT g_0.e1, g_0.e2 FROM pm1.g2 AS g_0"}); //$NON-NLS-1$ //$NON-NLS-2$ = List[] expected =3D new List[] { Arrays.asList(new Object[] {"a", 0}), //$NON-NLS-1$ @@ -51,7 +51,7 @@ public void testIntersect() { String sql =3D "select e1, e2 from pm1.g2 intersect select e1, 1 f= rom pm1.g2"; //$NON-NLS-1$ = - ProcessorPlan plan =3D TestOptimizer.helpPlan(sql, FakeMetadataFac= tory.example1Cached(), new String[] {"SELECT g_0.e1 FROM pm1.g2 AS g_0", "S= ELECT DISTINCT g_0.e1, g_0.e2 FROM pm1.g2 AS g_0"}); //$NON-NLS-1$ //$NON-= NLS-2$ + ProcessorPlan plan =3D TestOptimizer.helpPlan(sql, FakeMetadataFac= tory.example1Cached(), new String[] {"SELECT g_0.e1 FROM pm1.g2 AS g_0", "S= ELECT g_0.e1, g_0.e2 FROM pm1.g2 AS g_0"}); //$NON-NLS-1$ //$NON-NLS-2$ = List[] expected =3D new List[] { Arrays.asList(new Object[] {null, 1}), @@ -66,7 +66,7 @@ public void testIntersectExcept() { String sql =3D "select e1, e2 from pm1.g2 except select e1, 1 from= pm1.g2 intersect select 'a', e2 from pm1.g2"; //$NON-NLS-1$ = - ProcessorPlan plan =3D TestOptimizer.helpPlan(sql, FakeMetadataFac= tory.example1Cached(), new String[] {"SELECT g_0.e1 FROM pm1.g2 AS g_0", "S= ELECT DISTINCT g_0.e1, g_0.e2 FROM pm1.g2 AS g_0", "SELECT g_0.e2 FROM pm1.= g2 AS g_0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + ProcessorPlan plan =3D TestOptimizer.helpPlan(sql, FakeMetadataFac= tory.example1Cached(), new String[] {"SELECT g_0.e1 FROM pm1.g2 AS g_0", "S= ELECT g_0.e1, g_0.e2 FROM pm1.g2 AS g_0", "SELECT g_0.e2 FROM pm1.g2 AS g_0= "}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ = List[] expected =3D new List[] { Arrays.asList(new Object[] {null, 1}), Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/TestVir= tualDepJoin.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/engine/src/test/java/com/metamatrix/query/processor/TestVirtualDe= pJoin.java 2009-07-31 13:15:35 UTC (rev 1210) +++ trunk/engine/src/test/java/com/metamatrix/query/processor/TestVirtualDe= pJoin.java 2009-07-31 15:42:46 UTC (rev 1211) @@ -391,8 +391,8 @@ = List expectedQueries =3D new ArrayList(6); for (int i =3D 0; i < 3; i++) { - expectedQueries.add("SELECT g_0.id AS c_0, g_0.first AS c_1, g_0.= last AS c_2 FROM CustomerMaster.Customers AS g_0 WHERE g_0.first =3D 'Miles= ' ORDER BY c_0"); //$NON-NLS-1$ - expectedQueries.add("SELECT g_0.id AS c_0, g_0.amount AS c_1 FROM= Europe.CustAccts AS g_0 WHERE g_0.id =3D 100 ORDER BY c_0"); //$NON-NLS-1$ + expectedQueries.add("SELECT DISTINCT g_0.id AS c_0, g_0.first AS = c_1, g_0.last AS c_2 FROM CustomerMaster.Customers AS g_0 WHERE g_0.first = =3D 'Miles' ORDER BY c_0"); //$NON-NLS-1$ + expectedQueries.add("SELECT DISTINCT g_0.id AS c_0, g_0.amount AS= c_1 FROM Europe.CustAccts AS g_0 WHERE g_0.id =3D 100 ORDER BY c_0"); //$N= ON-NLS-1$ } = assertEquals(expectedQueries, dataManager.getQueries()); Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/relatio= nal/TestSortNode.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/engine/src/test/java/com/metamatrix/query/processor/relational/Te= stSortNode.java 2009-07-31 13:15:35 UTC (rev 1210) +++ trunk/engine/src/test/java/com/metamatrix/query/processor/relational/Te= stSortNode.java 2009-07-31 15:42:46 UTC (rev 1211) @@ -32,7 +32,6 @@ import java.util.Set; = import org.junit.Test; -import org.mockito.Mockito; = import com.metamatrix.api.exception.MetaMatrixComponentException; import com.metamatrix.api.exception.MetaMatrixProcessingException; @@ -43,7 +42,6 @@ import com.metamatrix.common.buffer.TupleBatch; import com.metamatrix.common.buffer.TupleSource; import com.metamatrix.common.buffer.TupleSourceID; -import com.metamatrix.common.buffer.BufferManager.TupleSourceStatus; import com.metamatrix.common.buffer.BufferManager.TupleSourceType; import com.metamatrix.common.buffer.impl.SizeUtility; import com.metamatrix.common.types.DataTypeManager; --===============4658165262335912629==--