def declare_view_from_schema(viewcls: s_types.Type, *, ctx: context.ContextLevel) -> s_types.Type: 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 = viewcls.get_expr(ctx.env.schema) assert view_expr is not None view_ql = qlparser.parse(view_expr.text) viewcls_name = viewcls.get_name(ctx.env.schema) assert isinstance(view_ql, qlast.Expr), 'expected qlast.Expr' view_set = declare_view(view_ql, 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] assert vc is not None 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 declare_view_from_schema(viewcls: s_types.Type, *, ctx: context.ContextLevel) -> s_types.Type: 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 = viewcls.get_expr(ctx.env.schema) assert view_expr is not None view_ql = qlparser.parse(view_expr.text) viewcls_name = viewcls.get_name(ctx.env.schema) assert isinstance(view_ql, qlast.Expr), 'expected qlast.Expr' view_set = declare_view(view_ql, 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] assert vc is not None if not ctx.in_temp_scope: 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] # XXX: The current cardinality inference machine does not look # into unreferenced expression parts, which includes computables # that may be declared on an alias that another alias is referencing, # leaving Unknown cardinalities in place. To fix this, copy # cardinalities for computed pointers from the alias object in the # schema. view_type = setgen.get_set_type(view_set, ctx=subctx) if isinstance(view_type, s_objtypes.ObjectType): assert isinstance(viewcls, s_objtypes.ObjectType) _fixup_cardinalities( view_type, viewcls, ctx=ctx, ) return vc