Ejemplo n.º 1
0
    def _cmd_tree_from_ast(cls, schema, astnode, context):
        from edb.edgeql import compiler as qlcompiler

        propname = astnode.name.name

        parent_ctx = context.get(CommandContextToken)
        parent_op = parent_ctx.op
        field = parent_op.get_schema_metaclass().get_field(propname)
        if field is None:
            raise errors.SchemaDefinitionError(
                f'{propname!r} is not a valid field',
                context=astnode.context)

        if not (isinstance(astnode, qlast.SetInternalField)
                or field.allow_ddl_set
                or context.stdmode
                or context.testmode):
            raise errors.SchemaDefinitionError(
                f'{propname!r} is not a valid field',
                context=astnode.context)

        if field.type is s_expr.Expression:
            new_value = s_expr.Expression.from_ast(
                astnode.value,
                schema,
                context.modaliases,
            )
        else:
            if isinstance(astnode.value, qlast.Tuple):
                new_value = tuple(
                    qlcompiler.evaluate_ast_to_python_val(
                        el.value, schema=schema)
                    for el in astnode.value.elements
                )

            elif isinstance(astnode.value, qlast.ObjectRef):

                new_value = utils.ast_objref_to_objref(
                    astnode.value, modaliases=context.modaliases,
                    schema=schema)

            elif (isinstance(astnode.value, qlast.Set)
                    and not astnode.value.elements):
                # empty set
                new_value = None

            else:
                new_value = qlcompiler.evaluate_ast_to_python_val(
                    astnode.value, schema=schema)

        return cls(property=propname, new_value=new_value)
Ejemplo n.º 2
0
    def _cmd_tree_from_ast(
            cls, schema: s_schema.Schema, astnode: qlast.DDLOperation,
            context: sd.CommandContext) -> CreateAnnotationValue:
        from edb.edgeql import compiler as qlcompiler

        assert isinstance(astnode, qlast.CreateAnnotationValue)
        cmd = super()._cmd_tree_from_ast(schema, astnode, context)
        propname = sn.shortname_from_fullname(cmd.classname)

        value = qlcompiler.evaluate_ast_to_python_val(astnode.value,
                                                      schema=schema)

        if not isinstance(value, str):
            raise ValueError(
                f'unexpected value type in AnnotationValue: {value!r}')

        attr: Annotation = schema.get(propname)

        cmd.set_attribute_value(
            'annotation',
            utils.reduce_to_typeref(schema, attr),
        )

        cmd.set_attribute_value(
            'value',
            value,
        )

        cmd.set_attribute_value(
            'is_final',
            not attr.get_inheritable(schema),
        )

        assert isinstance(cmd, CreateAnnotationValue)
        return cmd
Ejemplo n.º 3
0
    def _parse_field_setters(
            self, scls, field_decls: typing.List[qlast.Field]):
        fields = type(scls).get_fields()
        updates = {}

        for field_decl in field_decls:
            fieldname = field_decl.name.name

            attrfield = fields.get(fieldname)
            if attrfield is None or not attrfield.allow_ddl_set:
                raise errors.SchemaError(
                    f'unexpected field {fieldname}',
                    context=field_decl.context)

            if issubclass(attrfield.type, s_expr.Expression):
                updates[fieldname] = s_expr.Expression.from_ast(
                    field_decl.value,
                    self._schema,
                    self._mod_aliases,
                )

            else:
                updates[fieldname] = qlcompiler.evaluate_ast_to_python_val(
                    field_decl.value, self._schema,
                    modaliases=self._mod_aliases)

        if updates:
            self._schema = scls.update(self._schema, updates)
Ejemplo n.º 4
0
    def _cmd_tree_from_ast(cls, schema: s_schema.Schema,
                           astnode: qlast.DDLOperation,
                           context: sd.CommandContext) -> AlterAnnotationValue:
        assert isinstance(
            astnode,
            (qlast.CreateAnnotationValue, qlast.AlterAnnotationValue),
        )
        cmd = super()._cmd_tree_from_ast(schema, astnode, context)
        assert isinstance(cmd, AlterAnnotationValue)

        if astnode.value is not None:
            value = qlcompiler.evaluate_ast_to_python_val(astnode.value,
                                                          schema=schema)

            if not isinstance(value, str):
                raise ValueError(
                    f'unexpected value type in AnnotationValue: {value!r}')

            cmd.set_attribute_value(
                'value',
                value,
            )

        annoname = sn.shortname_from_fullname(cmd.classname)
        anno = utils.ast_objref_to_object_shell(
            utils.name_to_ast_ref(annoname),
            metaclass=Annotation,
            modaliases=context.modaliases,
            schema=schema,
        )
        cmd.set_attribute_value('annotation', value=anno, orig_value=anno)

        return cmd
Ejemplo n.º 5
0
    def _cmd_tree_from_ast(cls, schema, astnode, context):
        from edb.edgeql import compiler as qlcompiler

        cmd = super()._cmd_tree_from_ast(schema, astnode, context)
        propname = sn.shortname_from_fullname(cmd.classname)

        value = qlcompiler.evaluate_ast_to_python_val(astnode.value,
                                                      schema=schema)

        if not isinstance(value, str):
            raise ValueError(
                f'unexpected value type in AnnotationValue: {value!r}')

        attr = schema.get(propname)

        cmd.update((
            sd.AlterObjectProperty(property='annotation',
                                   new_value=utils.reduce_to_typeref(
                                       schema, attr)),
            sd.AlterObjectProperty(property='value', new_value=value),
            sd.AlterObjectProperty(
                property='inheritable',
                new_value=attr.get_inheritable(schema),
            ),
            sd.AlterObjectProperty(
                property='is_final',
                new_value=not attr.get_inheritable(schema),
            ),
        ))

        return cmd
Ejemplo n.º 6
0
    def _cmd_tree_from_ast(
        cls,
        schema: s_schema.Schema,
        astnode: qlast.DDLOperation,
        context: sd.CommandContext
    ) -> AlterAnnotationValue:
        assert isinstance(astnode, qlast.AlterAnnotationValue)

        cmd = super()._cmd_tree_from_ast(schema, astnode, context)

        value = qlcompiler.evaluate_ast_to_python_val(
            astnode.value, schema=schema)

        if not isinstance(value, str):
            raise ValueError(
                f'unexpected value type in AnnotationValue: {value!r}')

        cmd.set_attribute_value(
            'value',
            value,
        )

        annoname = sn.shortname_from_fullname(cmd.classname)
        anno = schema.get(annoname, type=Annotation)

        cmd.set_attribute_value('annotation', value=anno, orig_value=anno)

        assert isinstance(cmd, AlterAnnotationValue)

        return cmd
Ejemplo n.º 7
0
    def _cmd_tree_from_ast(
        cls,
        schema: s_schema.Schema,
        astnode: qlast.DDLOperation,
        context: sd.CommandContext
    ) -> AlterAnnotationValue:
        from edb.edgeql import compiler as qlcompiler

        assert isinstance(astnode, qlast.AlterAnnotationValue)

        cmd = super()._cmd_tree_from_ast(schema, astnode, context)

        value = qlcompiler.evaluate_ast_to_python_val(
            astnode.value, schema=schema)

        if not isinstance(value, str):
            raise ValueError(
                f'unexpected value type in AnnotationValue: {value!r}')

        cmd.update((
            sd.AlterObjectProperty(
                property='value',
                new_value=value
            ),
        ))

        assert isinstance(cmd, AlterAnnotationValue)

        return cmd
Ejemplo n.º 8
0
    def _parse_attr_setters(
            self, scls, attrdecls: typing.List[qlast.Annotation]):
        for attrdecl in attrdecls:
            attr = self._get_ref_obj(attrdecl.name, s_anno.Annotation)
            value = qlcompiler.evaluate_ast_to_python_val(
                attrdecl.value, self._schema, modaliases=self._mod_aliases)

            if not isinstance(value, str):
                raise errors.SchemaDefinitionError(
                    'annotation value is not a string',
                    context=attrdecl.value.context)

            self._schema = scls.set_annotation(self._schema, attr, value)