def _apply_field_ast( self, schema: s_schema.Schema, context: sd.CommandContext, node: qlast.DDLOperation, op: sd.AlterObjectProperty, ) -> None: objtype = self.get_referrer_context(context) if op.property == 'required': # Due to how SDL is processed the underlying AST may be an # AlterConcreteLink, which requires different handling. if isinstance(node, qlast.CreateConcreteLink): assert isinstance(op.new_value, bool) node.is_required = op.new_value else: node.commands.append( qlast.SetSpecialField( name='required', value=op.new_value, ) ) elif op.property == 'cardinality': node.cardinality = op.new_value elif op.property == 'target' and objtype: # Due to how SDL is processed the underlying AST may be an # AlterConcreteLink, which requires different handling. if isinstance(node, qlast.CreateConcreteLink): if not node.target: expr = self.get_attribute_value('expr') if expr is not None: node.target = expr.qlast else: t = op.new_value assert isinstance(t, (so.Object, so.ObjectShell)) node.target = utils.typeref_to_ast(schema, t) else: assert isinstance(op.new_value, (so.Object, so.ObjectShell)) node.commands.append( qlast.SetLinkType( type=utils.typeref_to_ast(schema, op.new_value) ) ) elif op.property == 'on_target_delete': node.commands.append(qlast.OnTargetDelete(cascade=op.new_value)) else: super()._apply_field_ast(schema, context, node, op)
def _apply_field_ast( self, schema: s_schema.Schema, context: sd.CommandContext, node: qlast.DDLOperation, op: sd.AlterObjectProperty, ) -> None: # type ignore below, because the class is used as mixin link = context.get(PropertySourceContext) # type: ignore if op.property == 'required': if isinstance(node, qlast.CreateConcreteProperty): node.is_required = bool(op.new_value) else: node.commands.append( qlast.SetSpecialField( name='required', value=op.new_value, ), ) elif op.property == 'cardinality': node.cardinality = op.new_value elif op.property == 'target' and link: if isinstance(node, qlast.CreateConcreteProperty): expr = self.get_attribute_value('expr') if expr is not None: node.target = expr.qlast else: ref = op.new_value assert isinstance(ref, (so.Object, so.ObjectShell)) node.target = utils.typeref_to_ast(schema, ref) else: ref = op.new_value assert isinstance(ref, (so.Object, so.ObjectShell)) node.commands.append( qlast.SetPropertyType( type=utils.typeref_to_ast(schema, ref) ) ) else: super()._apply_field_ast(schema, context, node, op)