public Translator(ICriterionParser parser) { if (parser == null) { return; } this._parser = parser; }
/// <summary> /// Recursively convert groups into criteria /// </summary> /// <param name="groups"></param> /// <returns></returns> private IEnumerable <ICriterion> ConvertGroupsToCriteria(IEnumerable <IGroup> groups) { IGroup previousGroup = null; var criteria = new List <ICriterion>(); foreach (var group in groups) { if (group is CriterionGroup criterionGroup) { ICriterion criterion = null; if (group.HasNestedGroups) { criterion = new NestedCriterion() { Criteria = this.ConvertGroupsToCriteria(group.NestedGroups) }; } else { ICriterionParser criterionParser = null; if (group.Tokens.Any(i => i is RangeToken)) { criterionParser = new RangeCriterionParser(); } else { criterionParser = new CriterionParser(); } criterion = criterionParser.Parse(group.Tokens); criterion.Raw = group.Value; } // Join multiple conditions with a logical And/Or if (previousGroup != null && previousGroup is LogicGroup logicGroup) { criterion.LogicOperator = ((LogicToken)logicGroup.Tokens[0]).Operator; } criteria.Add(criterion); } previousGroup = group; } return(criteria); }