/// <summary> /// Builds search program from scheduled search plan at given index in pattern graph of the action rule pattern /// </summary> public static SearchProgram BuildSearchProgram( IGraphModel model, LGSPRulePattern rulePattern, int index, string nameOfSearchProgram, bool parallelized, bool emitProfiling) { PatternGraph patternGraph = rulePattern.patternGraph; String rulePatternClassName = NamesOfEntities.RulePatternClassName(rulePattern.name, rulePattern.PatternGraph.Package, false); // filter out parameters which are implemented by lookup due to maybe null unfolding // and suffix matcher method name by missing parameters which get computed by lookup here string[] parameterTypes; string[] parameterNames; String name; GetFilteredParametersAndSuffixedMatcherName( rulePattern, patternGraph, parallelized ? 0 : index, out parameterTypes, out parameterNames, out name); SearchProgramBodyBuilder builder = new SearchProgramBodyBuilder( SearchProgramType.Action, model, rulePatternClassName, rulePattern.patternGraph.Package != null ? rulePattern.patternGraph.Package + "::" + rulePattern.name : rulePattern.name, parameterNames, parameterTypes, patternGraph, emitProfiling, parallelized, index ); // this is the all presets available method (index 0) and there are presets which may be null? // -> collect data for missing preset calls List <String[]> paramTypesList = null; List <String[]> paramNamesList = null; List <String> suffixedMatcherNameList = null; if (patternGraph.schedules.Length > 1 && index == 0) { paramTypesList = new List <String[]>(); paramNamesList = new List <String[]>(); suffixedMatcherNameList = new List <String>(); for (int i = 0; i < patternGraph.schedules.Length; ++i) { String[] paramTypes; String[] paramNames; String suffixedMatcherName; GetFilteredParametersAndSuffixedMatcherName( rulePattern, patternGraph, i, out paramTypes, out paramNames, out suffixedMatcherName); paramTypesList.Add(paramTypes); paramNamesList.Add(paramNames); suffixedMatcherNameList.Add(suffixedMatcherName); } } // build outermost search program operation, create the list anchor starting its program bool containsSubpatterns = patternGraph.embeddedGraphsPlusInlined.Length > 0 || patternGraph.iteratedsPlusInlined.Length > 0 || patternGraph.alternativesPlusInlined.Length > 0; SearchProgram searchProgram; if (parallelized) { if (index == 1) { List <String> matchingPatternClassTypeNames = new List <String>(); List <Dictionary <PatternGraph, bool> > nestedIndependents = new List <Dictionary <PatternGraph, bool> >(); ExtractNestedIndependents(matchingPatternClassTypeNames, nestedIndependents, rulePattern, patternGraph); searchProgram = new SearchProgramOfActionParallelizationBody( rulePatternClassName, patternGraph.name, name + "_parallelized_body", rulePattern.patternGraph.patternGraphsOnPathToEnclosedPatternpath, containsSubpatterns, builder.wasIndependentInlined(patternGraph, index), matchingPatternClassTypeNames, nestedIndependents, emitProfiling, patternGraph.PackagePrefixedName); } else // index == 0 { searchProgram = new SearchProgramOfActionParallelizationHead( rulePatternClassName, patternGraph.name, parameterTypes, parameterNames, name + "_parallelized", emitProfiling, patternGraph.PackagePrefixedName); } } else { List <String> matchingPatternClassTypeNames = new List <String>(); List <Dictionary <PatternGraph, bool> > nestedIndependents = new List <Dictionary <PatternGraph, bool> >(); ExtractNestedIndependents(matchingPatternClassTypeNames, nestedIndependents, rulePattern, patternGraph); searchProgram = new SearchProgramOfAction( rulePatternClassName, patternGraph.name, parameterTypes, parameterNames, name, rulePattern.patternGraph.patternGraphsOnPathToEnclosedPatternpath, containsSubpatterns, builder.wasIndependentInlined(patternGraph, 0), matchingPatternClassTypeNames, nestedIndependents, emitProfiling, patternGraph.PackagePrefixedName, patternGraph.maybeNullElementNames, suffixedMatcherNameList, paramNamesList); } searchProgram.OperationsList = new SearchProgramList(searchProgram); SearchProgramOperation insertionPoint = searchProgram.OperationsList; if (!parallelized || index == 0) { insertionPoint = insertVariableDeclarations(insertionPoint, patternGraph); } // start building with first operation in scheduled search plan insertionPoint = builder.BuildScheduledSearchPlanOperationIntoSearchProgram( 0, insertionPoint); return(searchProgram); }
/// <summary> /// Builds search program from scheduled search plan at given index in pattern graph of the action rule pattern /// </summary> public SearchProgram BuildSearchProgram( IGraphModel model, LGSPRulePattern rulePattern, int index, string nameOfSearchProgram, bool parallelized, bool emitProfiling) { PatternGraph patternGraph = rulePattern.patternGraph; this.model = model; patternGraphWithNestingPatterns = new Stack<PatternGraph>(); patternGraphWithNestingPatterns.Push(patternGraph); this.parallelized = parallelized; isoSpaceNeverAboveMaxIsoSpace = patternGraphWithNestingPatterns.Peek().maxIsoSpace < (int)LGSPElemFlags.MAX_ISO_SPACE; isNegative = false; isNestedInNegative = false; rulePatternClassName = NamesOfEntities.RulePatternClassName(rulePattern.name, rulePattern.PatternGraph.Package, false); this.emitProfiling = emitProfiling; packagePrefixedActionName = rulePattern.patternGraph.Package != null ? rulePattern.patternGraph.Package + "::" + rulePattern.name : rulePattern.name; firstLoopPassed = false; // filter out parameters which are implemented by lookup due to maybe null unfolding // and suffix matcher method name by missing parameters which get computed by lookup here String name; GetFilteredParametersAndSuffixedMatcherName( rulePattern, patternGraph, parallelized ? 0 : index, out parameterTypes, out parameterNames, out name); // this is the all presets available method (index 0) and there are presets which may be null? // -> collect data for missing preset calls List<String[]> paramTypesList = null; List<String[]> paramNamesList = null; List<String> suffixedMatcherNameList = null; if(patternGraph.schedules.Length>1 && index==0) { paramTypesList = new List<String[]>(); paramNamesList = new List<String[]>(); suffixedMatcherNameList = new List<String>(); for(int i=0; i<patternGraph.schedules.Length; ++i) { String[] paramTypes; String[] paramNames; String suffixedMatcherName; GetFilteredParametersAndSuffixedMatcherName( rulePattern, patternGraph, i, out paramTypes, out paramNames, out suffixedMatcherName); paramTypesList.Add(paramTypes); paramNamesList.Add(paramNames); suffixedMatcherNameList.Add(suffixedMatcherName); } } // build outermost search program operation, create the list anchor starting its program bool containsSubpatterns = patternGraph.embeddedGraphsPlusInlined.Length > 0 || patternGraph.iteratedsPlusInlined.Length > 0 || patternGraph.alternativesPlusInlined.Length > 0; SearchProgram searchProgram; if(parallelized) { if(index == 1) { searchProgram = new SearchProgramOfActionParallelizationBody( rulePatternClassName, patternGraph.name, name + "_parallelized_body", rulePattern.patternGraph.patternGraphsOnPathToEnclosedPatternpath, containsSubpatterns, wasIndependentInlined(patternGraph, index), emitProfiling, patternGraph.PackagePrefixedName); } else // index == 0 { searchProgram = new SearchProgramOfActionParallelizationHead( rulePatternClassName, patternGraph.name, parameterTypes, parameterNames, name + "_parallelized", emitProfiling, patternGraph.PackagePrefixedName); } } else { searchProgram = new SearchProgramOfAction( rulePatternClassName, patternGraph.name, parameterTypes, parameterNames, name, rulePattern.patternGraph.patternGraphsOnPathToEnclosedPatternpath, containsSubpatterns, wasIndependentInlined(patternGraph, indexOfSchedule), emitProfiling, patternGraph.PackagePrefixedName, patternGraph.maybeNullElementNames, suffixedMatcherNameList, paramNamesList); } searchProgram.OperationsList = new SearchProgramList(searchProgram); SearchProgramOperation insertionPoint = searchProgram.OperationsList; if(!parallelized || index == 0) insertionPoint = insertVariableDeclarations(insertionPoint, patternGraph); // start building with first operation in scheduled search plan indexOfSchedule = index; insertionPoint = BuildScheduledSearchPlanOperationIntoSearchProgram( 0, insertionPoint); patternGraphWithNestingPatterns.Pop(); return searchProgram; }