// private static methods private static AstFilter CreateRegexFilter(AstFilterField field, Modifiers modifiers, string pattern) { var combinedPattern = "^" + modifiers.LeadingPattern + pattern + modifiers.TrailingPattern + "$"; if (combinedPattern.StartsWith("^.*")) { combinedPattern = combinedPattern.Substring(3); } if (combinedPattern.EndsWith(".*$")) { combinedPattern = combinedPattern.Substring(0, combinedPattern.Length - 3); } var options = CreateRegexOptions(modifiers); return(AstFilter.Regex(field, combinedPattern, options)); }
public override AstNode VisitFilterField(AstFilterField node) { // "_elements.0.X" => { __agg0 : { $first : "$$ROOT" } } + "__agg0.X" if (node.Path.StartsWith("_elements.0.")) { var accumulatorExpression = AstExpression.AccumulatorExpression(AstAccumulatorOperator.First, AstExpression.Var("ROOT")); var accumulatorFieldName = _accumulators.AddAccumulatorExpression(accumulatorExpression); var restOfPath = node.Path.Substring("_elements.0.".Length); var rewrittenPath = $"{accumulatorFieldName}.{restOfPath}"; return(AstFilter.Field(rewrittenPath, node.Serializer)); } if (node.Path == "_elements" || node.Path.StartsWith("_elements.")) { throw new UnableToRemoveReferenceToElementsException(); } return(base.VisitFilterField(node)); }