def type_to_ql_typeref(t: s_obj.Object, *, _name=None, ctx: context.ContextLevel) -> qlast.TypeName: if t.is_any(): result = qlast.TypeName(name=_name, maintype=qlast.AnyType()) elif t.is_anytuple(): result = qlast.TypeName(name=_name, maintype=qlast.AnyTuple()) elif not isinstance(t, s_abc.Collection): result = qlast.TypeName(name=_name, maintype=qlast.ObjectRef( module=t.get_name(ctx.env.schema).module, name=t.get_name(ctx.env.schema).name)) elif isinstance(t, s_abc.Tuple) and t.named: result = qlast.TypeName( name=_name, maintype=qlast.ObjectRef(name=t.schema_name), subtypes=[ type_to_ql_typeref(st, _name=sn, ctx=ctx) for sn, st in t.iter_subtypes(ctx.env.schema) ]) else: result = qlast.TypeName(name=_name, maintype=qlast.ObjectRef(name=t.schema_name), subtypes=[ type_to_ql_typeref(st, ctx=ctx) for st in t.get_subtypes(ctx.env.schema) ]) return result
def declare_view_from_schema( viewcls: s_obj.Object, *, ctx: context.ContextLevel) -> irast.Set: vc = ctx.env.schema_view_cache.get(viewcls) if vc is not None: return vc with ctx.detached() as subctx: subctx.expr_exposed = False view_expr = qlparser.parse(viewcls.get_expr(ctx.env.schema).text) viewcls_name = viewcls.get_name(ctx.env.schema) view_set = declare_view(view_expr, alias=viewcls_name, fully_detached=True, ctx=subctx) # The view path id _itself_ should not be in the nested namespace. view_set.path_id = view_set.path_id.replace_namespace( ctx.path_id_namespace) vc = subctx.aliased_views[viewcls_name] ctx.env.schema_view_cache[viewcls] = vc ctx.source_map.update(subctx.source_map) ctx.aliased_views[viewcls_name] = subctx.aliased_views[viewcls_name] ctx.view_nodes[vc.get_name(ctx.env.schema)] = vc ctx.view_sets[vc] = subctx.view_sets[vc] return vc
def derive_view(stype: s_obj.Object, source: typing.Optional[s_nodes.Node] = None, target: typing.Optional[s_nodes.Node] = None, *qualifiers, derived_name: typing.Optional[sn.SchemaName] = None, derived_name_quals: typing.Optional[typing.Sequence[str]] = (), derived_name_base: typing.Optional[str] = None, merge_bases=None, preserve_shape: bool = False, is_insert: bool = False, is_update: bool = False, attrs: typing.Optional[dict] = None, ctx: context.ContextLevel) -> s_obj.Object: if source is None: source = stype if derived_name is None and (ctx.derived_target_module or source is stype): derived_name = derive_view_name(stype=stype, derived_name_quals=derived_name_quals, derived_name_base=derived_name_base, ctx=ctx) if isinstance(stype, s_abc.Type): if is_insert: vtype = s_types.ViewType.Insert elif is_update: vtype = s_types.ViewType.Update else: vtype = s_types.ViewType.Select if attrs is None: attrs = {} else: attrs = dict(attrs) attrs['view_type'] = vtype if isinstance(stype, s_abc.Collection): ctx.env.schema, derived = stype.derive_subtype(ctx.env.schema, name=derived_name) else: if stype.get_name(ctx.env.schema) == derived_name: qualifiers = list(qualifiers) qualifiers.append(ctx.aliases.get('d')) ctx.env.schema, derived = stype.derive(ctx.env.schema, source, target, *qualifiers, merge_bases=merge_bases, name=derived_name, mark_derived=True, attrs=attrs) if not stype.generic(ctx.env.schema): if isinstance(derived, s_sources.Source): scls_pointers = stype.get_pointers(ctx.env.schema) derived_own_pointers = derived.get_own_pointers(ctx.env.schema) for pn, ptr in derived_own_pointers.items(ctx.env.schema): # This is a view of a view. Make sure query-level # computable expressions for pointers are carried over. src_ptr = scls_pointers.get(ctx.env.schema, pn) computable_data = ctx.source_map.get(src_ptr) if computable_data is not None: ctx.source_map[ptr] = computable_data if isinstance(derived, s_abc.Type): ctx.view_nodes[derived.get_name(ctx.env.schema)] = derived if preserve_shape and stype in ctx.env.view_shapes: ctx.env.view_shapes[derived] = ctx.env.view_shapes[stype] return derived