예제 #1
0
    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)
예제 #2
0
 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),
     )
예제 #3
0
파일: stmtctx.py 프로젝트: joe2hpimn/edgedb
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
예제 #4
0
    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)
예제 #5
0
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)
예제 #6
0
    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)
예제 #7
0
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