def amend_empty_set_type(es: irast.EmptySet, t: s_obj.Object, schema) -> None: alias = es.path_id[-1].name.name scls_name = s_name.Name(module='__expr__', name=alias) scls = t.__class__(name=scls_name, bases=[t]) scls.acquire_ancestor_inheritance(schema) es.path_id = irast.PathId(scls) es.scls = t
def compile_Tuple(expr: irast.Base, *, ctx: context.CompilerContextLevel) -> pgast.Base: ttype = _infer_type(expr, ctx=ctx) ttypes = ttype.element_types telems = list(ttypes) path_id = irast.PathId(ttype) elements = [] for i, e in enumerate(expr.elements): telem = telems[i] ttype = ttypes[telem] el_path_id = irutils.tuple_indirection_path_id(path_id, telem, ttype) val = dispatch.compile(e.val, ctx=ctx) elements.append(pgast.TupleElement(path_id=el_path_id, val=val)) result = pgast.TupleVar(elements=elements) return output.output_as_value(result, env=ctx.env)
def get_path_id(scls: s_obj.Object, *, ctx: context.CompilerContext) -> irast.PathId: return irast.PathId(scls, namespace=ctx.path_id_namespace)
def _cmd_tree_from_ast(cls, astnode, context, schema): from edb.lang.edgeql import utils as ql_utils from edb.lang.ir import ast as irast from edb.lang.ir import inference as ir_inference from edb.lang.ir import utils as ir_utils from . import objtypes as s_objtypes cmd = super()._cmd_tree_from_ast(astnode, context, schema) if isinstance(astnode, qlast.CreateConcreteLink): cmd.add( sd.AlterObjectProperty(property='required', new_value=astnode.is_required)) # "source" attribute is set automatically as a refdict back-attr parent_ctx = context.get(LinkSourceCommandContext) source_name = parent_ctx.op.classname target_type = None if len(astnode.targets) > 1: cmd.add( sd.AlterObjectProperty( property='spectargets', new_value=so.ObjectList([ utils.ast_to_typeref(t, modaliases=context.modaliases, schema=schema) for t in astnode.targets ]))) target_name = sources.Source.gen_virt_parent_name( (sn.Name(module=t.maintype.module, name=t.maintype.name) for t in astnode.targets), module=source_name.module) target = so.ObjectRef(classname=target_name) create_virt_parent = s_objtypes.CreateObjectType( classname=target_name, metaclass=s_objtypes.ObjectType) create_virt_parent.update( (sd.AlterObjectProperty( property='bases', new_value=so.ObjectList([ so.ObjectRef( classname=sn.Name(module='std', name='Object')) ])), sd.AlterObjectProperty(property='name', new_value=target_name), sd.AlterObjectProperty(property='is_virtual', new_value=True))) alter_db_ctx = context.get(s_db.DatabaseCommandContext) for cc in alter_db_ctx.op.get_subcommands( type=s_objtypes.CreateObjectType): if cc.classname == create_virt_parent.classname: break else: alter_db_ctx.op.add(create_virt_parent) else: target_expr = astnode.targets[0] if isinstance(target_expr, qlast.TypeName): target = utils.ast_to_typeref( target_expr, modaliases=context.modaliases, schema=schema) else: # computable source = schema.get(source_name, default=None) if source is None: raise s_err.SchemaDefinitionError( f'cannot define link computables in CREATE TYPE', hint='Perform a CREATE TYPE without the link ' 'followed by ALTER TYPE defining the ' 'computable', context=target_expr.context) ir, _, target_expr = ql_utils.normalize_tree( target_expr, schema, anchors={qlast.Source: source}) try: target_type = ir_utils.infer_type(ir, schema) except edgeql.EdgeQLError as e: raise s_err.SchemaDefinitionError( 'could not determine the result type of ' 'computable expression', context=target_expr.context) from e target = utils.reduce_to_typeref(target_type) cmd.add( sd.AlterObjectProperty(property='default', new_value=target_expr)) cmd.add( sd.AlterObjectProperty(property='computable', new_value=True)) singletons = {irast.PathId(source)} cardinality = ir_inference.infer_cardinality( ir, singletons, schema) if cardinality == qlast.Cardinality.ONE: link_card = pointers.PointerCardinality.ManyToOne else: link_card = pointers.PointerCardinality.ManyToMany cmd.add( sd.AlterObjectProperty(property='cardinality', new_value=link_card)) if (isinstance(target, so.ObjectRef) and target.classname == source_name): # Special case for loop links. Since the target # is the same as the source, we know it's a proper # type. pass else: if target_type is None: target_type = utils.resolve_typeref(target, schema=schema) if not isinstance(target_type, s_objtypes.ObjectType): raise s_err.SchemaDefinitionError( f'invalid link target, expected object type, got ' f'{target_type.__class__.__name__}', context=astnode.targets[0].context) cmd.add(sd.AlterObjectProperty(property='target', new_value=target)) base_prop_name = sn.Name('std::source') s_name = lproperties.Property.get_specialized_name( base_prop_name, cmd.classname) src_prop_name = sn.Name(name=s_name, module=cmd.classname.module) src_prop = lproperties.CreateProperty( classname=src_prop_name, metaclass=lproperties.Property) src_prop.update(( sd.AlterObjectProperty(property='name', new_value=src_prop_name), sd.AlterObjectProperty( property='bases', new_value=[so.ObjectRef(classname=base_prop_name)]), sd.AlterObjectProperty( property='source', new_value=so.ObjectRef(classname=cmd.classname)), sd.AlterObjectProperty( property='target', new_value=so.ObjectRef(classname=source_name)), sd.AlterObjectProperty(property='required', new_value=True), sd.AlterObjectProperty(property='readonly', new_value=True), )) cmd.add(src_prop) base_prop_name = sn.Name('std::target') s_name = lproperties.Property.get_specialized_name( base_prop_name, cmd.classname) tgt_prop_name = sn.Name(name=s_name, module=cmd.classname.module) tgt_prop = lproperties.CreateProperty( classname=tgt_prop_name, metaclass=lproperties.Property) tgt_prop.update(( sd.AlterObjectProperty(property='name', new_value=tgt_prop_name), sd.AlterObjectProperty( property='bases', new_value=[so.ObjectRef(classname=base_prop_name)]), sd.AlterObjectProperty( property='source', new_value=so.ObjectRef(classname=cmd.classname)), sd.AlterObjectProperty(property='target', new_value=target), sd.AlterObjectProperty(property='required', new_value=False), sd.AlterObjectProperty(property='readonly', new_value=True), )) cmd.add(tgt_prop) cls._parse_default(cmd) return cmd