public void TestBuildNoOuter() { var graph = MakeQueryGraph(); var spec = TwoStreamQueryPlanBuilder.Build(typesPerStream, graph, null, new StreamJoinAnalysisResultCompileTime(2)); EPAssertionUtil.AssertEqualsExactOrder(new[] { "P01", "P02" }, spec.IndexSpecs[0].IndexProps[0]); EPAssertionUtil.AssertEqualsExactOrder(new[] { "P11", "P12" }, spec.IndexSpecs[1].IndexProps[0]); Assert.AreEqual(2, spec.ExecNodeSpecs.Length); }
public void TestBuildOuter() { var graph = MakeQueryGraph(); var spec = TwoStreamQueryPlanBuilder.Build(typesPerStream, graph, OuterJoinType.LEFT, new StreamJoinAnalysisResultCompileTime(2)); EPAssertionUtil.AssertEqualsExactOrder(new[] { "P01", "P02" }, spec.IndexSpecs[0].IndexProps[0]); EPAssertionUtil.AssertEqualsExactOrder(new[] { "P11", "P12" }, spec.IndexSpecs[1].IndexProps[0]); Assert.AreEqual(2, spec.ExecNodeSpecs.Length); Assert.AreEqual(typeof(TableOuterLookupNodeForge), spec.ExecNodeSpecs[0].GetType()); Assert.AreEqual(typeof(TableLookupNodeForge), spec.ExecNodeSpecs[1].GetType()); }
public static QueryPlanForgeDesc GetPlan( EventType[] typesPerStream, OuterJoinDesc[] outerJoinDescList, QueryGraphForge queryGraph, string[] streamNames, HistoricalViewableDesc historicalViewableDesc, DependencyGraph dependencyGraph, HistoricalStreamIndexListForge[] historicalStreamIndexLists, StreamJoinAnalysisResultCompileTime streamJoinAnalysisResult, bool isQueryPlanLogging, StatementRawInfo statementRawInfo, StatementCompileTimeServices services) { string methodName = ".getPlan "; int numStreams = typesPerStream.Length; if (numStreams < 2) { throw new ArgumentException("Number of join stream types is less then 2"); } if (outerJoinDescList.Length >= numStreams) { throw new ArgumentException("Too many outer join descriptors found"); } if (numStreams == 2) { OuterJoinType? outerJoinType = null; if (outerJoinDescList.Length > 0) { outerJoinType = outerJoinDescList[0].OuterJoinType; } QueryPlanForgeDesc queryPlan = TwoStreamQueryPlanBuilder.Build( typesPerStream, queryGraph, outerJoinType, streamJoinAnalysisResult, statementRawInfo); RemoveUnidirectionalAndTable(queryPlan.Forge, streamJoinAnalysisResult); if (Log.IsDebugEnabled) { Log.Debug(methodName + "2-Stream queryPlan=" + queryPlan); } return queryPlan; } bool hasPreferMergeJoin = HintEnum.PREFER_MERGE_JOIN.GetHint(statementRawInfo.Annotations) != null; bool hasForceNestedIter = HintEnum.FORCE_NESTED_ITER.GetHint(statementRawInfo.Annotations) != null; bool isAllInnerJoins = outerJoinDescList.Length == 0 || OuterJoinDesc.ConsistsOfAllInnerJoins(outerJoinDescList); if (isAllInnerJoins && !hasPreferMergeJoin) { QueryPlanForgeDesc queryPlan = NStreamQueryPlanBuilder.Build( queryGraph, typesPerStream, historicalViewableDesc, dependencyGraph, historicalStreamIndexLists, hasForceNestedIter, streamJoinAnalysisResult.UniqueKeys, streamJoinAnalysisResult.TablesPerStream, streamJoinAnalysisResult, statementRawInfo, services.SerdeResolver); if (queryPlan != null) { RemoveUnidirectionalAndTable(queryPlan.Forge, streamJoinAnalysisResult); if (Log.IsDebugEnabled) { Log.Debug(methodName + "N-Stream inner-join queryPlan=" + queryPlan); } return queryPlan; } if (isQueryPlanLogging && QUERY_PLAN_LOG.IsInfoEnabled) { Log.Info("Switching to Outer-NStream algorithm for query plan"); } } QueryPlanForgeDesc queryPlanX = NStreamOuterQueryPlanBuilder.Build( queryGraph, outerJoinDescList, streamNames, typesPerStream, historicalViewableDesc, dependencyGraph, historicalStreamIndexLists, streamJoinAnalysisResult.UniqueKeys, streamJoinAnalysisResult.TablesPerStream, streamJoinAnalysisResult, statementRawInfo, services); RemoveUnidirectionalAndTable(queryPlanX.Forge, streamJoinAnalysisResult); return queryPlanX; }