public void ValidatePositionals(ExprValidationContext validationContext) { ExprAggregateNodeParamDesc paramDesc = ExprAggregateNodeUtil.GetValidatePositionalParams(ChildNodes, true); if (validationContext.StatementRawInfo.StatementType == StatementType.CREATE_TABLE && (paramDesc.OptLocalGroupBy != null || paramDesc.OptionalFilter != null)) { throw new ExprValidationException( "The 'group_by' and 'filter' parameter is not allowed in create-table statements"); } optionalAggregateLocalGroupByDesc = paramDesc.OptLocalGroupBy; optionalFilter = paramDesc.OptionalFilter; if (optionalAggregateLocalGroupByDesc != null) { ExprNodeUtilityValidate.ValidateNoSpecialsGroupByExpressions( optionalAggregateLocalGroupByDesc.PartitionExpressions); } if (optionalFilter != null) { ExprNodeUtilityValidate.ValidateNoSpecialsGroupByExpressions(new[] {optionalFilter}); } if (optionalFilter != null && IsFilterExpressionAsLastParameter) { if (paramDesc.PositionalParams.Length > 1) { throw new ExprValidationException("Only a single filter expression can be provided"); } positionalParams = ExprNodeUtilityMake.AddExpression(paramDesc.PositionalParams, optionalFilter); } else { positionalParams = paramDesc.PositionalParams; } }
public ExprAggregateNodeParamDesc( ExprNode[] positionalParams, ExprAggregateLocalGroupByDesc optLocalGroupBy, ExprNode optionalFilter) { PositionalParams = positionalParams; OptLocalGroupBy = optLocalGroupBy; OptionalFilter = optionalFilter; }
public static ExprAggregateNodeParamDesc GetValidatePositionalParams( ExprNode[] childNodes, bool builtinAggregationFunc) { ExprAggregateLocalGroupByDesc optionalLocalGroupBy = null; ExprNode optionalFilter = null; var count = 0; foreach (var node in childNodes) { if (!IsNonPositionalParameter(node)) { count++; } else { var namedParameterNode = (ExprNamedParameterNode) node; var paramNameLower = namedParameterNode.ParameterName.ToLowerInvariant(); if (paramNameLower.Equals("group_by")) { optionalLocalGroupBy = new ExprAggregateLocalGroupByDesc(namedParameterNode.ChildNodes); } else if (paramNameLower.Equals("filter")) { if ((namedParameterNode.ChildNodes.Length != 1) | (namedParameterNode.ChildNodes[0].Forge.EvaluationType.GetBoxedType() != typeof(bool?))) { throw new ExprValidationException( "Filter named parameter requires a single expression returning a boolean-typed value"); } optionalFilter = namedParameterNode.ChildNodes[0]; } else if (builtinAggregationFunc) { throw new ExprValidationException( "Invalid named parameter '" + namedParameterNode.ParameterName + "' (did you mean 'group_by' or 'filter'?)"); } } } var positionals = new ExprNode[count]; count = 0; foreach (var node in childNodes) { if (!IsNonPositionalParameter(node)) { positionals[count++] = node; } } return new ExprAggregateNodeParamDesc(positionals, optionalLocalGroupBy, optionalFilter); }