def _parse_subject_indexes(self, subject, subjdecl): module_aliases = {None: subject.get_name(self._schema).module} for indexdecl in subjdecl.indexes: index_name = self._get_ref_name(indexdecl.name) index_name = subject.get_name(self._schema) + '.' + index_name local_name = s_name.get_specialized_name( index_name, subject.get_name(self._schema)) der_name = s_name.Name(name=local_name, module=subject.get_name( self._schema).module) _, _, index_expr = qlutils.normalize_tree( indexdecl.expression, self._schema, modaliases=module_aliases, anchors={qlast.Subject: subject}, inline_anchors=True) self._schema, index = s_indexes.Index.create_in_schema( self._schema, name=der_name, expr=s_expr.Expression(text=index_expr), subject=subject) self._schema = subject.add_index(self._schema, index)
def _get_derived_ptr_name(self, ptr_name, source): source_name = source.get_name(self._schema) shortname = s_name.Name( module=source_name.module, name=ptr_name, ) return s_name.Name( module=source.get_name(self._schema).module, name=s_name.get_specialized_name(shortname, source_name), )
def declare_view( expr: qlast.Base, alias: str, *, fully_detached: bool=False, temporary_scope: bool=True, ctx: context.ContextLevel) -> irast.Set: with ctx.newscope(temporary=temporary_scope, fenced=True) as subctx: if not fully_detached: cached_view_set = ctx.expr_view_cache.get((expr, alias)) # Detach the view namespace and record the prefix # in the parent statement's fence node. view_path_id_ns = irast.WeakNamespace(ctx.aliases.get('ns')) subctx.path_id_namespace |= {view_path_id_ns} ctx.path_scope.add_namespaces((view_path_id_ns,)) else: cached_view_set = None if ctx.stmt is not None: subctx.stmt = ctx.stmt.parent_stmt if cached_view_set is not None: subctx.view_scls = setgen.get_set_type(cached_view_set, ctx=ctx) view_name = subctx.view_scls.get_name(ctx.env.schema) else: if isinstance(alias, s_name.SchemaName): basename = alias else: basename = s_name.SchemaName(module='__derived__', name=alias) view_name = s_name.SchemaName( module=ctx.derived_target_module or '__derived__', name=s_name.get_specialized_name( basename, ctx.aliases.get('w') ) ) subctx.toplevel_result_view_name = view_name view_set = dispatch.compile(astutils.ensure_qlstmt(expr), ctx=subctx) if not fully_detached: # The view path id _itself_ should not be in the nested namespace. # The fully_detached case should be handled by the caller. view_set.path_id = view_set.path_id.replace_namespace( ctx.path_id_namespace) ctx.aliased_views[alias] = setgen.get_set_type(view_set, ctx=ctx) ctx.path_scope_map[view_set] = subctx.path_scope ctx.expr_view_cache[expr, alias] = view_set return view_set
def _parse_subject_indexes(self, subject, subjdecl): module_aliases = {None: subject.get_name(self._schema).module} for indexdecl in subjdecl.indexes: index_name = self._get_ref_name(indexdecl.name) index_name = subject.get_name(self._schema) + '.' + index_name local_name = s_name.get_specialized_name( index_name, subject.get_name(self._schema)) der_name = s_name.Name( name=local_name, module=subject.get_name(self._schema).module) self._schema, index = s_indexes.Index.create_in_schema( self._schema, name=der_name, expr=s_expr.Expression.from_ast( indexdecl.expression, self._schema, module_aliases), subject=subject, ) self._schema = subject.add_index(self._schema, index)
def derive_view_name( stype: s_obj.Object, derived_name_quals: typing.Optional[typing.Sequence[str]]=(), derived_name_base: typing.Optional[str]=None, *, ctx: context.ContextLevel) -> sn.Name: if not derived_name_quals: derived_name_quals = (ctx.aliases.get('view'),) if not derived_name_base: derived_name_base = stype.get_shortname(ctx.env.schema) if ctx.derived_target_module: derived_name_module = ctx.derived_target_module else: derived_name_module = '__derived__' derived_sname = sn.get_specialized_name( derived_name_base, *derived_name_quals) return sn.SchemaName(module=derived_name_module, name=derived_sname)
def _parse_subject_indexes(self, subject, subjdecl): for indexdecl in subjdecl.indexes: index_name = self._get_ref_name(indexdecl.name) index_name = subject.get_name(self._schema) + '.' + index_name local_name = s_name.get_specialized_name( index_name, subject.get_name(self._schema)) der_name = s_name.Name(name=local_name, module=subject.get_name( self._schema).module) if not isinstance(subject, s_abc.Pointer): singletons = [subject] path_prefix_anchor = qlast.Subject else: singletons = [] path_prefix_anchor = None index_expr = s_expr.Expression.compiled( s_expr.Expression.from_ast(indexdecl.expression, self._schema, self._mod_aliases), schema=self._schema, modaliases=self._mod_aliases, parent_object_type=type(subject), anchors={qlast.Subject: subject}, path_prefix_anchor=path_prefix_anchor, singletons=singletons, ) self._schema, index = s_indexes.Index.create_in_schema( self._schema, name=der_name, expr=index_expr, subject=subject, ) self._schema = subject.add_index(self._schema, index)
def declare_view( expr: qlast.Expr, alias: s_name.Name, *, factoring_fence: bool = False, fully_detached: bool = False, must_be_used: bool = False, path_id_namespace: Optional[FrozenSet[str]] = None, ctx: context.ContextLevel, ) -> irast.Set: pinned_pid_ns = path_id_namespace with ctx.newscope(fenced=True) as subctx: subctx.path_scope.factoring_fence = factoring_fence if path_id_namespace is not None: subctx.path_id_namespace = path_id_namespace if not fully_detached: cached_view_set = ctx.expr_view_cache.get((expr, alias)) # Detach the view namespace and record the prefix # in the parent statement's fence node. view_path_id_ns = irast.WeakNamespace(ctx.aliases.get('ns')) subctx.path_id_namespace |= {view_path_id_ns} ctx.path_scope.add_namespaces({view_path_id_ns}) else: cached_view_set = None if ctx.stmt is not None: subctx.stmt = ctx.stmt.parent_stmt if cached_view_set is not None: subctx.view_scls = setgen.get_set_type(cached_view_set, ctx=ctx) view_name = subctx.view_scls.get_name(ctx.env.schema) assert isinstance(view_name, s_name.QualName) else: if isinstance(alias, s_name.QualName): basename = alias else: basename = s_name.QualName(module='__derived__', name=alias.name) if (isinstance(alias, s_name.QualName) and subctx.env.options.schema_view_mode): view_name = basename subctx.recompiling_schema_alias = True else: view_name = s_name.QualName( module=ctx.derived_target_module or '__derived__', name=s_name.get_specialized_name(basename, ctx.aliases.get('w'))) subctx.toplevel_result_view_name = view_name view_set = dispatch.compile(astutils.ensure_qlstmt(expr), ctx=subctx) assert isinstance(view_set, irast.Set) ctx.path_scope_map[view_set] = context.ScopeInfo( path_scope=subctx.path_scope, pinned_path_id_ns=pinned_pid_ns, ) if not fully_detached: # The view path id _itself_ should not be in the nested namespace. # The fully_detached case should be handled by the caller. if path_id_namespace is None: path_id_namespace = ctx.path_id_namespace view_set.path_id = view_set.path_id.replace_namespace( path_id_namespace) view_type = setgen.get_set_type(view_set, ctx=ctx) ctx.aliased_views[alias] = view_type ctx.expr_view_cache[expr, alias] = view_set if must_be_used: ctx.must_use_views[view_type] = (alias, expr.context) return view_set