Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
 public ExprAggregateNodeParamDesc(
     ExprNode[] positionalParams,
     ExprAggregateLocalGroupByDesc optLocalGroupBy,
     ExprNode optionalFilter)
 {
     PositionalParams = positionalParams;
     OptLocalGroupBy = optLocalGroupBy;
     OptionalFilter = optionalFilter;
 }
Ejemplo n.º 3
0
        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);
        }