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)
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
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)
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
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
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
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
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)