def __init__(self, prevlevel, mode): self.mode = mode if prevlevel is None: self.env = None self.derived_target_module = None self.aliases = compiler.AliasGenerator() self.anchors = {} self.modaliases = {} self.stmt_metadata = {} self.completion_work = [] self.pending_cardinality = {} self.pointer_derivation_map = collections.defaultdict(list) self.source_map = {} self.view_nodes = {} self.view_sets = {} self.aliased_views = collections.ChainMap() self.expr_view_cache = {} self.shape_type_cache = {} self.class_view_overrides = {} self.clause = None self.toplevel_clause = None self.toplevel_stmt = None self.stmt = None self.path_id_namespace = frozenset() self.pending_stmt_own_path_id_namespace = frozenset() self.pending_stmt_full_path_id_namespace = frozenset() self.banned_paths = set() self.view_map = collections.ChainMap() self.path_scope = None self.path_scope_map = {} self.scope_id_ctr = compiler.Counter() self.view_scls = None self.expr_exposed = False self.partial_path_prefix = None self.view_rptr = None self.toplevel_result_view_name = None self.implicit_id_in_shapes = False self.implicit_tid_in_shapes = False self.special_computables_in_mutation_shape = frozenset() self.empty_result_type_hint = None self.defining_view = False else: self.env = prevlevel.env self.derived_target_module = prevlevel.derived_target_module self.aliases = prevlevel.aliases self.stmt_metadata = prevlevel.stmt_metadata self.completion_work = prevlevel.completion_work self.pending_cardinality = prevlevel.pending_cardinality self.pointer_derivation_map = prevlevel.pointer_derivation_map self.source_map = prevlevel.source_map self.view_nodes = prevlevel.view_nodes self.view_sets = prevlevel.view_sets self.expr_view_cache = prevlevel.expr_view_cache self.shape_type_cache = prevlevel.shape_type_cache self.path_id_namespace = prevlevel.path_id_namespace self.pending_stmt_own_path_id_namespace = \ prevlevel.pending_stmt_own_path_id_namespace self.pending_stmt_full_path_id_namespace = \ prevlevel.pending_stmt_full_path_id_namespace self.banned_paths = prevlevel.banned_paths self.view_map = prevlevel.view_map self.path_scope = prevlevel.path_scope self.path_scope_map = prevlevel.path_scope_map self.scope_id_ctr = prevlevel.scope_id_ctr self.view_scls = prevlevel.view_scls self.expr_exposed = prevlevel.expr_exposed self.partial_path_prefix = prevlevel.partial_path_prefix self.toplevel_clause = prevlevel.toplevel_clause self.toplevel_stmt = prevlevel.toplevel_stmt self.implicit_id_in_shapes = prevlevel.implicit_id_in_shapes self.implicit_tid_in_shapes = prevlevel.implicit_tid_in_shapes self.special_computables_in_mutation_shape = \ prevlevel.special_computables_in_mutation_shape self.empty_result_type_hint = prevlevel.empty_result_type_hint self.defining_view = prevlevel.defining_view if mode == ContextSwitchMode.SUBQUERY: self.anchors = prevlevel.anchors.copy() self.modaliases = prevlevel.modaliases.copy() self.aliased_views = prevlevel.aliased_views.new_child() self.class_view_overrides = \ prevlevel.class_view_overrides.copy() self.pending_stmt_own_path_id_namespace = None self.pending_stmt_full_path_id_namespace = None self.banned_paths = prevlevel.banned_paths.copy() self.view_rptr = None self.view_scls = None self.clause = None self.stmt = None self.view_rptr = None self.toplevel_result_view_name = None elif mode == ContextSwitchMode.DETACHED: self.anchors = prevlevel.anchors.copy() self.modaliases = prevlevel.modaliases.copy() self.aliased_views = collections.ChainMap() self.class_view_overrides = {} self.expr_exposed = prevlevel.expr_exposed self.view_nodes = {} self.view_sets = {} self.path_id_namespace = frozenset({self.aliases.get('ns')}) self.pending_stmt_own_path_id_namespace = frozenset() self.pending_stmt_full_path_id_namespace = frozenset() self.banned_paths = set() self.view_rptr = None self.view_scls = None self.clause = None self.stmt = prevlevel.stmt self.partial_path_prefix = None self.view_rptr = None self.toplevel_result_view_name = None else: self.anchors = prevlevel.anchors self.modaliases = prevlevel.modaliases self.aliased_views = prevlevel.aliased_views self.class_view_overrides = prevlevel.class_view_overrides self.clause = prevlevel.clause self.stmt = prevlevel.stmt self.view_rptr = prevlevel.view_rptr self.toplevel_result_view_name = \ prevlevel.toplevel_result_view_name if mode in { ContextSwitchMode.NEWFENCE_TEMP, ContextSwitchMode.NEWSCOPE_TEMP }: if prevlevel.path_scope is None: prevlevel.path_scope = self.env.path_scope self.path_scope = prevlevel.path_scope.copy() if mode in { ContextSwitchMode.NEWFENCE, ContextSwitchMode.NEWFENCE_TEMP }: if prevlevel.path_scope is None: prevlevel.path_scope = self.env.path_scope self.path_scope = prevlevel.path_scope.attach_fence() if mode in { ContextSwitchMode.NEWSCOPE, ContextSwitchMode.NEWSCOPE_TEMP }: if prevlevel.path_scope is None: prevlevel.path_scope = self.env.path_scope self.path_scope = prevlevel.path_scope.attach_branch()
def __init__( self, prevlevel: Optional[ContextLevel], mode: ContextSwitchMode, *, env: Optional[Environment] = None, ) -> None: self.mode = mode if prevlevel is None: assert env is not None self.env = env self.derived_target_module = None self.aliases = compiler.AliasGenerator() self.anchors = {} self.modaliases = {} self.stmt_metadata = {} self.completion_work = [] self.pending_cardinality = {} self.pointer_derivation_map = collections.defaultdict(list) self.source_map = {} self.view_nodes = {} self.view_sets = {} self.aliased_views = collections.ChainMap() self.must_use_views = {} self.expr_view_cache = {} self.shape_type_cache = {} self.class_view_overrides = {} self.toplevel_stmt = None self.stmt = None self.path_id_namespace = frozenset() self.pending_stmt_own_path_id_namespace = frozenset() self.pending_stmt_full_path_id_namespace = frozenset() self.banned_paths = set() self.view_map = collections.ChainMap() self.path_scope = irast.new_scope_tree() self.path_scope_map = {} self.iterator_ctx = None self.iterator_path_ids = frozenset() self.scope_id_ctr = compiler.SimpleCounter() self.view_scls = None self.expr_exposed = False self.partial_path_prefix = None self.view_rptr = None self.toplevel_result_view_name = None self.implicit_id_in_shapes = False self.implicit_tid_in_shapes = False self.implicit_limit = 0 self.inhibit_implicit_limit = False self.special_computables_in_mutation_shape = frozenset() self.empty_result_type_hint = None self.defining_view = None self.compiling_update_shape = False self.in_conditional = None self.in_temp_scope = False self.tentative_work = [] self.disable_shadowing = set() self.path_log = None else: self.env = prevlevel.env self.derived_target_module = prevlevel.derived_target_module self.aliases = prevlevel.aliases self.stmt_metadata = prevlevel.stmt_metadata self.completion_work = prevlevel.completion_work self.pending_cardinality = prevlevel.pending_cardinality self.pointer_derivation_map = prevlevel.pointer_derivation_map self.source_map = prevlevel.source_map self.view_nodes = prevlevel.view_nodes self.view_sets = prevlevel.view_sets self.must_use_views = prevlevel.must_use_views self.expr_view_cache = prevlevel.expr_view_cache self.shape_type_cache = prevlevel.shape_type_cache self.iterator_ctx = prevlevel.iterator_ctx self.iterator_path_ids = prevlevel.iterator_path_ids self.path_id_namespace = prevlevel.path_id_namespace self.pending_stmt_own_path_id_namespace = \ prevlevel.pending_stmt_own_path_id_namespace self.pending_stmt_full_path_id_namespace = \ prevlevel.pending_stmt_full_path_id_namespace self.banned_paths = prevlevel.banned_paths self.view_map = prevlevel.view_map if prevlevel.path_scope is None: prevlevel.path_scope = self.env.path_scope self.path_scope = prevlevel.path_scope self.path_scope_map = prevlevel.path_scope_map self.scope_id_ctr = prevlevel.scope_id_ctr self.view_scls = prevlevel.view_scls self.expr_exposed = prevlevel.expr_exposed self.partial_path_prefix = prevlevel.partial_path_prefix self.toplevel_stmt = prevlevel.toplevel_stmt self.implicit_id_in_shapes = prevlevel.implicit_id_in_shapes self.implicit_tid_in_shapes = prevlevel.implicit_tid_in_shapes self.implicit_limit = prevlevel.implicit_limit self.inhibit_implicit_limit = prevlevel.inhibit_implicit_limit self.special_computables_in_mutation_shape = \ prevlevel.special_computables_in_mutation_shape self.empty_result_type_hint = prevlevel.empty_result_type_hint self.defining_view = prevlevel.defining_view self.compiling_update_shape = prevlevel.compiling_update_shape self.in_conditional = prevlevel.in_conditional self.in_temp_scope = prevlevel.in_temp_scope self.tentative_work = prevlevel.tentative_work self.disable_shadowing = prevlevel.disable_shadowing self.path_log = prevlevel.path_log if mode == ContextSwitchMode.SUBQUERY: self.anchors = prevlevel.anchors.copy() self.modaliases = prevlevel.modaliases.copy() self.aliased_views = prevlevel.aliased_views.new_child() self.class_view_overrides = \ prevlevel.class_view_overrides.copy() self.pending_stmt_own_path_id_namespace = frozenset() self.pending_stmt_full_path_id_namespace = frozenset() self.banned_paths = prevlevel.banned_paths.copy() self.view_rptr = None self.view_scls = None self.stmt = None self.view_rptr = None self.toplevel_result_view_name = None elif mode == ContextSwitchMode.DETACHED: self.anchors = prevlevel.anchors.copy() self.modaliases = prevlevel.modaliases.copy() self.aliased_views = collections.ChainMap() self.class_view_overrides = {} self.expr_exposed = prevlevel.expr_exposed self.view_nodes = {} self.view_sets = {} self.path_id_namespace = frozenset({self.aliases.get('ns')}) self.pending_stmt_own_path_id_namespace = frozenset() self.pending_stmt_full_path_id_namespace = frozenset() self.banned_paths = set() self.iterator_ctx = None self.iterator_path_ids = frozenset() self.view_rptr = None self.view_scls = None self.stmt = prevlevel.stmt self.partial_path_prefix = None self.view_rptr = None self.toplevel_result_view_name = None self.disable_shadowing = prevlevel.disable_shadowing.copy() else: self.anchors = prevlevel.anchors self.modaliases = prevlevel.modaliases self.aliased_views = prevlevel.aliased_views self.class_view_overrides = prevlevel.class_view_overrides self.stmt = prevlevel.stmt self.view_rptr = prevlevel.view_rptr self.toplevel_result_view_name = \ prevlevel.toplevel_result_view_name if mode in {ContextSwitchMode.NEWFENCE_TEMP, ContextSwitchMode.NEWSCOPE_TEMP}: # Make a copy of the entire tree and set path_scope to # be the copy of the current node. Stash the root in # an attribute to keep it from being freed, since # scope tree parent pointers are weak pointers. self._stash, self.path_scope = self.path_scope.copy_all() self.in_temp_scope = True self.tentative_work = list(prevlevel.tentative_work) if mode in {ContextSwitchMode.NEWFENCE, ContextSwitchMode.NEWFENCE_TEMP}: self.path_scope = self.path_scope.attach_fence() if mode in {ContextSwitchMode.NEWSCOPE, ContextSwitchMode.NEWSCOPE_TEMP}: self.path_scope = self.path_scope.attach_branch()
def __init__( self, prevlevel: Optional[ContextLevel], mode: ContextSwitchMode, *, env: Optional[Environment] = None, ) -> None: self.mode = mode if prevlevel is None: assert env is not None self.env = env self.derived_target_module = None self.aliases = compiler.AliasGenerator() self.anchors = {} self.modaliases = {} self.stmt_metadata = {} self.source_map = {} self.view_nodes = {} self.view_sets = {} self.type_rewrites = {} self.aliased_views = collections.ChainMap() self.must_use_views = {} self.expr_view_cache = {} self.shape_type_cache = {} self.class_view_overrides = {} self.toplevel_stmt = None self.stmt = None self.qlstmt = None self.path_id_namespace = frozenset() self.pending_stmt_own_path_id_namespace = frozenset() self.pending_stmt_full_path_id_namespace = frozenset() self.banned_paths = set() self.view_map = collections.ChainMap() self.path_scope = env.path_scope self.path_scope_map = {} self.iterator_ctx = None self.iterator_path_ids = frozenset() self.scope_id_ctr = compiler.SimpleCounter() self.view_scls = None self.expr_exposed = False self.partial_path_prefix = None self.view_rptr = None self.toplevel_result_view_name = None self.implicit_id_in_shapes = False self.implicit_tid_in_shapes = False self.implicit_tname_in_shapes = False self.implicit_limit = 0 self.inhibit_implicit_limit = False self.special_computables_in_mutation_shape = frozenset() self.empty_result_type_hint = None self.defining_view = None self.compiling_update_shape = False self.in_conditional = None self.disable_shadowing = set() self.path_log = None self.recompiling_schema_alias = False else: self.env = prevlevel.env self.derived_target_module = prevlevel.derived_target_module self.aliases = prevlevel.aliases self.stmt_metadata = prevlevel.stmt_metadata self.source_map = prevlevel.source_map self.view_nodes = prevlevel.view_nodes self.view_sets = prevlevel.view_sets self.type_rewrites = prevlevel.type_rewrites self.must_use_views = prevlevel.must_use_views self.expr_view_cache = prevlevel.expr_view_cache self.shape_type_cache = prevlevel.shape_type_cache self.iterator_ctx = prevlevel.iterator_ctx self.iterator_path_ids = prevlevel.iterator_path_ids self.path_id_namespace = prevlevel.path_id_namespace self.pending_stmt_own_path_id_namespace = \ prevlevel.pending_stmt_own_path_id_namespace self.pending_stmt_full_path_id_namespace = \ prevlevel.pending_stmt_full_path_id_namespace self.banned_paths = prevlevel.banned_paths self.view_map = prevlevel.view_map if prevlevel.path_scope is None: prevlevel.path_scope = self.env.path_scope self.path_scope = prevlevel.path_scope self.path_scope_map = prevlevel.path_scope_map self.scope_id_ctr = prevlevel.scope_id_ctr self.view_scls = prevlevel.view_scls self.expr_exposed = prevlevel.expr_exposed self.partial_path_prefix = prevlevel.partial_path_prefix self.toplevel_stmt = prevlevel.toplevel_stmt self.implicit_id_in_shapes = prevlevel.implicit_id_in_shapes self.implicit_tid_in_shapes = prevlevel.implicit_tid_in_shapes self.implicit_tname_in_shapes = prevlevel.implicit_tname_in_shapes self.implicit_limit = prevlevel.implicit_limit self.inhibit_implicit_limit = prevlevel.inhibit_implicit_limit self.special_computables_in_mutation_shape = \ prevlevel.special_computables_in_mutation_shape self.empty_result_type_hint = prevlevel.empty_result_type_hint self.defining_view = prevlevel.defining_view self.compiling_update_shape = prevlevel.compiling_update_shape self.in_conditional = prevlevel.in_conditional self.disable_shadowing = prevlevel.disable_shadowing self.path_log = prevlevel.path_log self.recompiling_schema_alias = prevlevel.recompiling_schema_alias if mode == ContextSwitchMode.SUBQUERY: self.anchors = prevlevel.anchors.copy() self.modaliases = prevlevel.modaliases.copy() self.aliased_views = prevlevel.aliased_views.new_child() self.class_view_overrides = \ prevlevel.class_view_overrides.copy() self.pending_stmt_own_path_id_namespace = frozenset() self.pending_stmt_full_path_id_namespace = frozenset() self.banned_paths = prevlevel.banned_paths.copy() self.view_rptr = None self.view_scls = None self.stmt = None self.qlstmt = None self.view_rptr = None self.toplevel_result_view_name = None elif mode == ContextSwitchMode.DETACHED: self.anchors = prevlevel.anchors.copy() self.modaliases = prevlevel.modaliases.copy() self.aliased_views = collections.ChainMap() self.class_view_overrides = {} self.expr_exposed = prevlevel.expr_exposed self.view_nodes = {} self.view_sets = {} self.path_id_namespace = frozenset({self.aliases.get('ns')}) self.pending_stmt_own_path_id_namespace = frozenset() self.pending_stmt_full_path_id_namespace = frozenset() self.banned_paths = set() self.iterator_ctx = None self.iterator_path_ids = frozenset() self.view_rptr = None self.view_scls = None self.stmt = prevlevel.stmt self.qlstmt = prevlevel.qlstmt self.partial_path_prefix = None self.view_rptr = None self.toplevel_result_view_name = None self.disable_shadowing = prevlevel.disable_shadowing.copy() else: self.anchors = prevlevel.anchors self.modaliases = prevlevel.modaliases self.aliased_views = prevlevel.aliased_views self.class_view_overrides = prevlevel.class_view_overrides self.stmt = prevlevel.stmt self.qlstmt = prevlevel.qlstmt self.view_rptr = prevlevel.view_rptr self.toplevel_result_view_name = \ prevlevel.toplevel_result_view_name if mode == ContextSwitchMode.NEWFENCE: self.path_scope = self.path_scope.attach_fence() if mode == ContextSwitchMode.NEWSCOPE: self.path_scope = self.path_scope.attach_branch()