def ensure_stmt(expr: irast.Base, *, ctx: context.ContextLevel) -> irast.Stmt: if not isinstance(expr, irast.Stmt): expr = irast.SelectStmt( result=ensure_set(expr, ctx=ctx), implicit_wrapper=True, ) return expr
def compile_GroupQuery( expr: qlast.Base, *, ctx: context.ContextLevel) -> irast.Base: with ctx.subquery() as ictx: stmt = irast.GroupStmt() init_stmt(stmt, expr, ctx=ictx, parent_ctx=ctx) c = s_objtypes.ObjectType( name=s_name.Name( module='__group__', name=ctx.aliases.get('Group')), bases=[ctx.schema.get('std::Object')] ) c.acquire_ancestor_inheritance(ctx.schema) stmt.group_path_id = pathctx.get_path_id(c, ctx=ictx) pathctx.register_set_in_scope(stmt.group_path_id, ctx=ictx) with ictx.newscope(fenced=True) as subjctx: subjctx.clause = 'input' subject_set = setgen.scoped_set( dispatch.compile(expr.subject, ctx=subjctx), ctx=subjctx) alias = expr.subject_alias or subject_set.path_id.target.name stmt.subject = stmtctx.declare_inline_view( subject_set, alias, ctx=ictx) with subjctx.new() as grpctx: stmt.groupby = compile_groupby_clause( expr.groupby, ctx=grpctx) with ictx.subquery() as isctx, isctx.newscope(fenced=True) as sctx: o_stmt = sctx.stmt = irast.SelectStmt() o_stmt.result = compile_result_clause( expr.result, view_scls=ctx.view_scls, view_rptr=ctx.view_rptr, result_alias=expr.result_alias, view_name=ctx.toplevel_result_view_name, ctx=sctx) o_stmt.where = clauses.compile_where_clause( expr.where, ctx=sctx) o_stmt.orderby = clauses.compile_orderby_clause( expr.orderby, ctx=sctx) o_stmt.offset = clauses.compile_limit_offset_clause( expr.offset, ctx=sctx) o_stmt.limit = clauses.compile_limit_offset_clause( expr.limit, ctx=sctx) stmt.result = setgen.scoped_set(o_stmt, ctx=sctx) result = fini_stmt(stmt, expr, ctx=ictx, parent_ctx=ctx) return result
def compile_ForQuery( qlstmt: qlast.ForQuery, *, ctx: context.ContextLevel) -> irast.Base: with ctx.subquery() as sctx: stmt = irast.SelectStmt() init_stmt(stmt, qlstmt, ctx=sctx, parent_ctx=ctx) if qlstmt.offset is not None or qlstmt.limit is not None: # LIMIT and OFFSET are infix operators with both # operands being SET OF, so we need to compile # the body of the statement behind a fence. sctx.path_scope = sctx.path_scope.attach_fence() with sctx.newscope(fenced=True) as scopectx: iterator = qlstmt.iterator if isinstance(iterator, qlast.Set) and len(iterator.elements) == 1: iterator = iterator.elements[0] iterator_view = stmtctx.declare_view( iterator, qlstmt.iterator_alias, ctx=scopectx) stmt.iterator_stmt = setgen.new_set_from_set( iterator_view, ctx=scopectx) iterator_scope = scopectx.path_scope_map.get(iterator_view) pathctx.register_set_in_scope(stmt.iterator_stmt, ctx=sctx) node = sctx.path_scope.find_descendant(stmt.iterator_stmt.path_id) node.attach_subtree(iterator_scope) stmt.result = compile_result_clause( qlstmt.result, view_scls=ctx.view_scls, view_rptr=ctx.view_rptr, result_alias=qlstmt.result_alias, view_name=ctx.toplevel_result_view_name, forward_rptr=True, ctx=sctx) stmt.where = clauses.compile_where_clause( qlstmt.where, ctx=sctx) stmt.orderby = clauses.compile_orderby_clause( qlstmt.orderby, ctx=sctx) if qlstmt.offset is not None or qlstmt.limit is not None: sctx.path_scope = sctx.path_scope.parent stmt.offset = clauses.compile_limit_offset_clause( qlstmt.offset, ctx=sctx) stmt.limit = clauses.compile_limit_offset_clause( qlstmt.limit, ctx=sctx) result = fini_stmt(stmt, qlstmt, ctx=sctx, parent_ctx=ctx) return result
def compile_SelectQuery( expr: qlast.SelectQuery, *, ctx: context.ContextLevel) -> irast.Base: if astutils.is_degenerate_select(expr) and ctx.toplevel_stmt is not None: # Compile implicit "SELECT Path" as "Path" with ctx.new() as sctx: process_with_block(expr, ctx=sctx, parent_ctx=ctx) sctx.aliased_views = ctx.aliased_views.new_child() sctx.modaliases = ctx.modaliases.copy() sctx.anchors = ctx.anchors.copy() result = compile_result_clause( expr.result, view_scls=ctx.view_scls, view_rptr=ctx.view_rptr, view_name=ctx.toplevel_result_view_name, ctx=sctx) result = fini_stmt(result, expr, ctx=sctx, parent_ctx=ctx) return result with ctx.subquery() as sctx: stmt = irast.SelectStmt() init_stmt(stmt, expr, ctx=sctx, parent_ctx=ctx) compile_limit_offset = False if expr.offset is not None or expr.limit is not None: # LIMIT and OFFSET are infix operators with both # operands being SET OF, so we need to compile # the body of the statement behind a fence. metadata = ctx.stmt_metadata.get(expr) if metadata is None: metadata = context.StatementMetadata() ctx.stmt_metadata[expr] = metadata if not metadata.ignore_offset_limit: metadata.ignore_offset_limit = True compile_limit_offset = True if compile_limit_offset: sctx.toplevel_result_view_name = ctx.toplevel_result_view_name stmt.result = compile_result_clause( expr, view_scls=ctx.view_scls, view_rptr=ctx.view_rptr, ctx=sctx) if ctx.toplevel_result_view_name: alias = ctx.aliases.get('expr') stmt.result.path_id = setgen.get_expression_path_id( stmt.result.scls, alias, ctx=ctx) stmt.offset = clauses.compile_limit_offset_clause( expr.offset, ctx=sctx) stmt.limit = clauses.compile_limit_offset_clause( expr.limit, ctx=sctx) else: stmt.result = compile_result_clause( expr.result, view_scls=ctx.view_scls, view_rptr=ctx.view_rptr, result_alias=expr.result_alias, view_name=ctx.toplevel_result_view_name, ctx=sctx) stmt.where = clauses.compile_where_clause( expr.where, ctx=sctx) stmt.orderby = clauses.compile_orderby_clause( expr.orderby, ctx=sctx) result = fini_stmt(stmt, expr, ctx=sctx, parent_ctx=ctx) return result
def compile_GroupQuery( expr: qlast.Base, *, ctx: context.ContextLevel) -> irast.Base: raise errors.UnsupportedFeatureError( "'GROUP' statement is not currently implemented", context=expr.context) with ctx.subquery() as ictx: stmt = irast.GroupStmt() init_stmt(stmt, expr, ctx=ictx, parent_ctx=ctx) typename = s_name.Name( module='__group__', name=ctx.aliases.get('Group')) obj = ctx.env.schema.get('std::Object') stmt.group_path_id = pathctx.get_path_id( obj, typename=typename, ctx=ictx) pathctx.register_set_in_scope(stmt.group_path_id, ctx=ictx) with ictx.newscope(fenced=True) as subjctx: subjctx.clause = 'input' subject_set = setgen.scoped_set( dispatch.compile(expr.subject, ctx=subjctx), ctx=subjctx) alias = expr.subject_alias or subject_set.path_id.target_name stmt.subject = stmtctx.declare_inline_view( subject_set, alias, ctx=ictx) with subjctx.new() as grpctx: stmt.groupby = compile_groupby_clause( expr.groupby, ctx=grpctx) with ictx.subquery() as isctx, isctx.newscope(fenced=True) as sctx: o_stmt = sctx.stmt = irast.SelectStmt() o_stmt.result = compile_result_clause( expr.result, view_scls=ctx.view_scls, view_rptr=ctx.view_rptr, result_alias=expr.result_alias, view_name=ctx.toplevel_result_view_name, ctx=sctx) o_stmt.where = clauses.compile_where_clause( expr.where, ctx=sctx) o_stmt.orderby = clauses.compile_orderby_clause( expr.orderby, ctx=sctx) o_stmt.offset = clauses.compile_limit_offset_clause( expr.offset, ctx=sctx) o_stmt.limit = clauses.compile_limit_offset_clause( expr.limit, ctx=sctx) stmt.result = setgen.scoped_set(o_stmt, ctx=sctx) result = fini_stmt(stmt, expr, ctx=ictx, parent_ctx=ctx) return result