protected override string FilterFunctionParameterType(int i, FilterCall filterCall, SequenceRuleCall seq) { if(filterCall.Name == "keepFirst" || filterCall.Name == "removeFirst") return "int"; if(filterCall.Name == "keepFirstFraction" || filterCall.Name == "removeFirstFraction") return "double"; if(filterCall.Name == "keepLast" || filterCall.Name == "removeLast") return "int"; if(filterCall.Name == "keepLastFraction" || filterCall.Name == "removeLastFraction") return "double"; foreach(IFilter filter in seq.ParamBindings.Action.RulePattern.Filters) { if(filter is IFilterFunction) { IFilterFunction filterFunction = (IFilterFunction)filter; if(filterCall.PackagePrefixedName == filterFunction.PackagePrefixedName) return TypesHelper.DotNetTypeToXgrsType(filterFunction.Inputs[i]); } } throw new Exception("Internal error"); }
protected override bool IsFilterExisting(FilterCall filterCall, SequenceRuleCall seq) { if(filterCall.Name == "keepFirst" || filterCall.Name == "removeFirst" || filterCall.Name == "keepFirstFraction" || filterCall.Name == "removeFirstFraction" || filterCall.Name == "keepLast" || filterCall.Name == "removeLast" || filterCall.Name == "keepLastFraction" || filterCall.Name == "removeLastFraction") { filterCall.Package = null; filterCall.PackagePrefixedName = filterCall.Name; return true; } filterCall.Package = filterCall.PrePackage; filterCall.PackagePrefixedName = filterCall.Package != null ? filterCall.Package + "::" + filterCall.Name : filterCall.Name; if(filterCall.IsContainedIn(seq.ParamBindings.Action.RulePattern.Filters)) return true; if(filterCall.IsAutoGenerated && seq.ParamBindings.Package != null) { filterCall.Package = seq.ParamBindings.Package; filterCall.PackagePrefixedName = seq.ParamBindings.Package + "::" + filterCall.Name; return filterCall.IsContainedIn(seq.ParamBindings.Action.RulePattern.Filters); } return false; }
protected override int NumFilterFunctionParameters(FilterCall filterCall, SequenceRuleCall seq) { if(filterCall.Name == "keepFirst" || filterCall.Name == "removeFirst" || filterCall.Name == "keepFirstFraction" || filterCall.Name == "removeFirstFraction" || filterCall.Name == "keepLast" || filterCall.Name == "removeLast" || filterCall.Name == "keepLastFraction" || filterCall.Name == "removeLastFraction") { return 1; } foreach(IFilter filter in seq.ParamBindings.Action.RulePattern.Filters) { if(filter is IFilterFunction) { IFilterFunction filterFunction = (IFilterFunction)filter; if(filterCall.PackagePrefixedName == filterFunction.PackagePrefixedName) return filterFunction.Inputs.Length; } } return 0; // auto-generated }
protected abstract int NumFilterFunctionParameters(FilterCall filterCall, SequenceRuleCall seq);
protected abstract string FilterFunctionParameterType(int i, FilterCall filterCall, SequenceRuleCall seq);
protected override string FilterFunctionParameterType(int i, FilterCall filterCall, SequenceRuleCall seq) { if(filterCall.Name == "keepFirst" || filterCall.Name == "removeFirst") return "int"; if(filterCall.Name == "keepFirstFraction" || filterCall.Name == "removeFirstFraction") return "double"; if(filterCall.Name == "keepLast" || filterCall.Name == "removeLast") return "int"; if(filterCall.Name == "keepLastFraction" || filterCall.Name == "removeLastFraction") return "double"; return filterFunctionsToInputTypes[filterCall.PackagePrefixedName][i]; }
protected abstract bool IsFilterExisting(FilterCall filterCall, SequenceRuleCall seq);
protected override int NumFilterFunctionParameters(FilterCall filterCall, SequenceRuleCall seq) { if(filterCall.Name == "keepFirst" || filterCall.Name == "removeFirst" || filterCall.Name == "keepFirstFraction" || filterCall.Name == "removeFirstFraction" || filterCall.Name == "keepLast" || filterCall.Name == "removeLast" || filterCall.Name == "keepLastFraction" || filterCall.Name == "removeLastFraction") { return 1; } if(filterFunctionsToInputTypes.ContainsKey(filterCall.PackagePrefixedName)) return filterFunctionsToInputTypes[filterCall.PackagePrefixedName].Count; else return 0; // auto-supplied }
protected override bool IsFilterExisting(FilterCall filterCall, SequenceRuleCall seq) { if(filterCall.Name == "keepFirst" || filterCall.Name == "removeFirst" || filterCall.Name == "keepFirstFraction" || filterCall.Name == "removeFirstFraction" || filterCall.Name == "keepLast" || filterCall.Name == "removeLast" || filterCall.Name == "keepLastFraction" || filterCall.Name == "removeLastFraction") { filterCall.Package = null; filterCall.PackagePrefixedName = filterCall.Name; return true; } if(filterCall.PrePackage != null) { filterCall.Package = filterCall.PrePackage; filterCall.PackagePrefixedName = filterCall.PrePackage + "::" + filterCall.Name; return filterCall.IsContainedIn(rulesToFilters[seq.ParamBindings.PackagePrefixedName]); } else { filterCall.Package = null; filterCall.PackagePrefixedName = filterCall.Name; if(filterCall.IsContainedIn(rulesToFilters[seq.ParamBindings.PackagePrefixedName])) return true; if(filterCall.PrePackageContext != null) { filterCall.Package = filterCall.PrePackageContext; filterCall.PackagePrefixedName = filterCall.PrePackageContext + "::" + filterCall.Name; if(filterCall.IsContainedIn(rulesToFilters[seq.ParamBindings.PackagePrefixedName])) return true; } if(filterCall.IsAutoGenerated && seq.ParamBindings.Package != null) { filterCall.Package = seq.ParamBindings.Package; filterCall.PackagePrefixedName = seq.ParamBindings.Package + "::" + filterCall.Name; return filterCall.IsContainedIn(rulesToFilters[seq.ParamBindings.PackagePrefixedName]); } return false; } }
void EmitFilterCall(SourceBuilder source, FilterCall filterCall, string patternName, string matchesName) { if(filterCall.Name == "keepFirst" || filterCall.Name == "removeFirst" || filterCall.Name == "keepFirstFraction" || filterCall.Name == "removeFirstFraction" || filterCall.Name == "keepLast" || filterCall.Name == "removeLast" || filterCall.Name == "keepLastFraction" || filterCall.Name == "removeLastFraction") { switch(filterCall.Name) { case "keepFirst": source.AppendFrontFormat("{0}.FilterKeepFirst((int)({1}));\n", matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source)); break; case "keepLast": source.AppendFrontFormat("{0}.FilterKeepLast((int)({1}));\n", matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source)); break; case "keepFirstFraction": source.AppendFrontFormat("{0}.FilterKeepFirstFraction((double)({1}));\n", matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source)); break; case "keepLastFraction": source.AppendFrontFormat("{0}.FilterKeepLastFraction((double)({1}));\n", matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source)); break; case "removeFirst": source.AppendFrontFormat("{0}.FilterRemoveFirst((int)({1}));\n", matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source)); break; case "removeLast": source.AppendFrontFormat("{0}.FilterRemoveLast((int)({1}));\n", matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source)); break; case "removeFirstFraction": source.AppendFrontFormat("{0}.FilterRemoveFirstFraction((double)({1}));\n", matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source)); break; case "removeLastFraction": source.AppendFrontFormat("{0}.FilterRemoveLastFraction((double)({1}));\n", matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source)); break; } } else { if(filterCall.IsAutoGenerated && filterCall.Name == "auto") source.AppendFrontFormat("GRGEN_ACTIONS.{0}MatchFilters.Filter_{1}_{2}(procEnv, {3});\n", TypesHelper.GetPackagePrefixDot(filterCall.Package), patternName, filterCall.Name, matchesName); else if(filterCall.IsAutoGenerated) source.AppendFrontFormat("GRGEN_ACTIONS.{0}MatchFilters.Filter_{1}_{2}_{3}(procEnv, {4});\n", TypesHelper.GetPackagePrefixDot(filterCall.Package), patternName, filterCall.Name, filterCall.Entity, matchesName); else { source.AppendFrontFormat("GRGEN_ACTIONS.{0}MatchFilters.Filter_{1}(procEnv, {2}", TypesHelper.GetPackagePrefixDot(filterCall.Package), filterCall.Name, matchesName); for(int i = 0; i < filterCall.ArgumentExpressions.Length; ++i) { source.AppendFormat(", ({0})({1})", TypesHelper.XgrsTypeToCSharpType(filterFunctionsToInputTypes[filterCall.Name][i], model), GetSequenceExpression(filterCall.ArgumentExpressions[i], source)); } source.Append(");\n"); } } }
void GRGEN_LIBGR.IAction.Filter(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, GRGEN_LIBGR.IMatches matches, GRGEN_LIBGR.FilterCall filter) { if (filter.IsAutoSupplied) { switch (filter.Name) { case "keepFirst": matches.FilterKeepFirst((int)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break; case "keepLast": matches.FilterKeepLast((int)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break; case "keepFirstFraction": matches.FilterKeepFirstFraction((double)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break; case "keepLastFraction": matches.FilterKeepLastFraction((double)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break; case "removeFirst": matches.FilterRemoveFirst((int)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break; case "removeLast": matches.FilterRemoveLast((int)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break; case "removeFirstFraction": matches.FilterRemoveFirstFraction((double)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break; case "removeLastFraction": matches.FilterRemoveLastFraction((double)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break; default: throw new Exception("Unknown auto supplied filter name!"); } return; } switch (filter.FullName) { default: throw new Exception("Unknown filter name!"); } }
/// <summary> /// Filters the matches of a multi rule all call or multi rule backtracking construct /// (i.e. matches obtained from different rules, that implement a match class). /// </summary> /// <param name="actionEnv">The action execution environment, required by the filter implementation.</param> /// <param name="matches">The combined list of all matches of all rules (implementing the same match class; to inspect and filter)</param> /// <param name="filter">The filter to apply</param> public abstract void Filter(IActionExecutionEnvironment actionEnv, IList <IMatch> matches, FilterCall filter);