Beispiel #1
0
    def _apply_fields_ast(
        self,
        schema: s_schema.Schema,
        context: sd.CommandContext,
        node: qlast.DDLOperation,
    ) -> None:
        super()._apply_fields_ast(schema, context, node)

        if isinstance(node, qlast.CreateConstraint):
            params = []
            for op in self.get_subcommands(type=s_func.ParameterCommand):
                props = op.get_resolved_attributes(schema, context)
                pname = s_func.Parameter.paramname_from_fullname(props['name'])
                if pname == '__subject__':
                    continue
                num = props['num']
                default = props.get('default')
                param = qlast.FuncParam(
                    name=pname,
                    type=utils.typeref_to_ast(schema, props['type']),
                    typemod=props['typemod'],
                    kind=props['kind'],
                    default=default.qlast if default is not None else None,
                )
                params.append((num, param))

            params.sort(key=lambda e: e[0])

            node.params = [p[1] for p in params]
Beispiel #2
0
 def get_ast(self, schema: s_schema.Schema) -> qlast.FuncParam:
     default = self.get_default(schema)
     return qlast.FuncParam(
         name=self.get_parameter_name(schema),
         type=utils.typeref_to_ast(schema, self.get_type(schema)),
         typemod=self.get_typemod(schema),
         kind=self.get_kind(schema),
         default=default.qlast if default else None,
     )
Beispiel #3
0
 def reduce_kwarg(self, *kids):
     r"""%reduce OptParameterKind FuncDeclArgName COLON \
             OptTypeQualifier FullTypeExpr OptDefault \
     """
     self.val = qlast.FuncParam(kind=kids[0].val,
                                name=kids[1].val,
                                typemod=kids[3].val,
                                type=kids[4].val,
                                default=kids[5].val)
Beispiel #4
0
    def _apply_fields_ast(self, schema, context, node):
        super()._apply_fields_ast(schema, context, node)

        params = []
        for op in self.get_subcommands(type=ParameterCommand):
            props = op.get_struct_properties(schema)
            num = props['num']
            default = props.get('default')
            param = qlast.FuncParam(
                name=Parameter.paramname_from_fullname(props['name']),
                type=utils.typeref_to_ast(schema, props['type']),
                typemod=props['typemod'],
                kind=props['kind'],
                default=default.qlast if default is not None else None,
            )
            params.append((num, param))

        params.sort(key=lambda e: e[0])

        node.params = [p[1] for p in params]
Beispiel #5
0
    def _init_constraints(self, constraints):
        for constraint, decl in constraints.items():
            attrs = {a.name.name: a.value for a in decl.fields}
            assert 'subject' not in attrs  # TODO: Add proper validation
            assert 'subjectexpr' not in attrs  # TODO: Add proper validation

            self._schema, params = s_func.FuncParameterList.from_ast(
                self._schema,
                decl,
                self._mod_aliases,
                func_fqname=constraint.get_name(self._schema),
                prepend=[
                    qlast.FuncParam(
                        name='__subject__',
                        type=qlast.TypeName(maintype=qlast.AnyType(), ),
                        typemod=qltypes.TypeModifier.SINGLETON,
                        kind=qltypes.ParameterKind.POSITIONAL,
                        default=None,
                    ),
                ],
            )

            for param in params.objects(self._schema):
                p_kind = param.get_kind(self._schema)
                if p_kind is qltypes.ParameterKind.NAMED_ONLY:
                    raise errors.InvalidConstraintDefinitionError(
                        'named only parameters are not allowed '
                        'in this context',
                        context=decl.context)

                if param.get_default(self._schema) is not None:
                    raise errors.InvalidConstraintDefinitionError(
                        'constraints do not support parameters '
                        'with defaults',
                        context=decl.context)

            anchors, _ = qlcompiler.get_param_anchors_for_callable(
                params, self._schema)

            expr = attrs.pop('expr', None)
            if expr is not None:
                self._schema = constraint.set_field_value(
                    self._schema,
                    'expr',
                    s_expr.Expression.compiled(
                        s_expr.Expression.from_ast(expr, self._schema,
                                                   self._mod_aliases),
                        schema=self._schema,
                        modaliases=self._mod_aliases,
                        anchors=anchors,
                        func_params=params,
                        allow_generic_type_output=True,
                        parent_object_type=type(constraint),
                    ),
                )

            subjexpr = decl.subject
            if subjexpr is not None:
                self._schema = constraint.set_field_value(
                    self._schema,
                    'subjectexpr',
                    s_expr.Expression.compiled(
                        s_expr.Expression.from_ast(subjexpr, self._schema,
                                                   self._mod_aliases),
                        schema=self._schema,
                        modaliases=self._mod_aliases,
                        anchors=anchors,
                        func_params=params,
                        allow_generic_type_output=True,
                        parent_object_type=type(constraint),
                    ),
                )

            self._schema = constraint.set_field_value(self._schema, 'params',
                                                      params)