Class: Alf::Sql::Compiler
- Inherits:
-
Compiler
- Object
- Compiler
- Alf::Sql::Compiler
- Defined in:
- lib/alf/sql/compiler.rb
Instance Method Summary collapse
- #compile(plan, expr, compiled, usage_count) ⇒ Object
- #join(plan) ⇒ Object
-
#on_clip(plan, expr, compiled) ⇒ Object
non-relational.
-
#on_frame(plan, expr, compiled) ⇒ Object
relational.
- #on_intersect(plan, expr, left, right) ⇒ Object
- #on_join(plan, expr, left, right) ⇒ Object
-
#on_leaf_operand(plan, expr) ⇒ Object
base.
- #on_matching(plan, expr, left, right) ⇒ Object
- #on_minus(plan, expr, left, right) ⇒ Object
- #on_not_matching(plan, expr, left, right) ⇒ Object
- #on_page(plan, expr, compiled) ⇒ Object
- #on_project(plan, expr, compiled) ⇒ Object
- #on_rename(plan, expr, compiled) ⇒ Object
- #on_restrict(plan, expr, compiled) ⇒ Object
- #on_sort(plan, expr, compiled) ⇒ Object
-
#on_union(plan, expr, left, right) ⇒ Object
def on_summarize(plan, expr, compiled) # -> SQL’s GROUP-BY end.
- #reuse(plan, cog) ⇒ Object
- #supports_reuse? ⇒ Boolean
Instance Method Details
#compile(plan, expr, compiled, usage_count) ⇒ Object
17 18 19 20 21 22 23 |
# File 'lib/alf/sql/compiler.rb', line 17 def compile(plan, expr, compiled, usage_count) cog = super if (usage_count > 1) and cog.should_be_reused? cog = rewrite(plan, cog.expr, cog, Processor::FromSelf, []) end cog end |
#on_clip(plan, expr, compiled) ⇒ Object
non-relational
33 34 35 |
# File 'lib/alf/sql/compiler.rb', line 33 def on_clip(plan, expr, compiled) rewrite(plan, expr, compiled, Processor::Clip, [expr.attributes, :is_table_dee]) end |
#on_frame(plan, expr, compiled) ⇒ Object
relational
47 48 49 50 51 52 |
# File 'lib/alf/sql/compiler.rb', line 47 def on_frame(plan, expr, compiled) compiled = plan.recompile(compiled){|p| p.sort(expr.operand, expr.total_ordering) } rewrite(plan, expr, compiled, Processor::LimitOffset, [expr.limit, expr.offset]) end |
#on_intersect(plan, expr, left, right) ⇒ Object
54 55 56 |
# File 'lib/alf/sql/compiler.rb', line 54 def on_intersect(plan, expr, left, right) rewrite(plan, expr, left, Processor::Merge, [:intersect, right.sexpr]) end |
#on_join(plan, expr, left, right) ⇒ Object
58 59 60 61 62 63 64 65 66 |
# File 'lib/alf/sql/compiler.rb', line 58 def on_join(plan, expr, left, right) if right.sexpr.is_table_dee? rewrite(plan, expr, left, Processor::SemiJoin, [right.sexpr, false]) elsif left.sexpr.is_table_dee? rewrite(plan, expr, right, Processor::SemiJoin, [left.sexpr, false]) else rewrite(plan, expr, left, Processor::Join, [right.sexpr]) end end |
#on_leaf_operand(plan, expr) ⇒ Object
base
27 28 29 |
# File 'lib/alf/sql/compiler.rb', line 27 def on_leaf_operand(plan, expr) fresh_cog(expr, builder(plan).select_all(expr.heading, expr.name)) end |
#on_matching(plan, expr, left, right) ⇒ Object
68 69 70 |
# File 'lib/alf/sql/compiler.rb', line 68 def on_matching(plan, expr, left, right) rewrite(plan, expr, left, Processor::SemiJoin, [right.sexpr, false]) end |
#on_minus(plan, expr, left, right) ⇒ Object
72 73 74 |
# File 'lib/alf/sql/compiler.rb', line 72 def on_minus(plan, expr, left, right) rewrite(plan, expr, left, Processor::Merge, [:except, right.sexpr]) end |
#on_not_matching(plan, expr, left, right) ⇒ Object
76 77 78 |
# File 'lib/alf/sql/compiler.rb', line 76 def on_not_matching(plan, expr, left, right) rewrite(plan, expr, left, Processor::SemiJoin, [right.sexpr, true]) end |
#on_page(plan, expr, compiled) ⇒ Object
80 81 82 83 84 85 86 87 88 |
# File 'lib/alf/sql/compiler.rb', line 80 def on_page(plan, expr, compiled) index, size = expr.page_index, expr.page_size compiled = plan.recompile(compiled){|p| ordering = expr.total_ordering ordering = ordering.reverse if index < 0 p.sort(expr.operand, ordering) } rewrite(plan, expr, compiled, Processor::LimitOffset, [size, (index.abs - 1) * size]) end |
#on_project(plan, expr, compiled) ⇒ Object
90 91 92 93 94 95 96 97 98 99 |
# File 'lib/alf/sql/compiler.rb', line 90 def on_project(plan, expr, compiled) compiled = plan.recompile(compiled){|p| p.clip(expr.operand, expr.stay_attributes) } preserving = expr.key_preserving? rescue false if not(preserving) and not(expr.stay_attributes.empty?) compiled = rewrite(plan, expr, compiled, Processor::Distinct) end rebind(plan, expr, compiled) end |
#on_rename(plan, expr, compiled) ⇒ Object
101 102 103 |
# File 'lib/alf/sql/compiler.rb', line 101 def on_rename(plan, expr, compiled) rewrite(plan, expr, compiled, Processor::Rename, [expr.renaming]) end |
#on_restrict(plan, expr, compiled) ⇒ Object
105 106 107 |
# File 'lib/alf/sql/compiler.rb', line 105 def on_restrict(plan, expr, compiled) rewrite(plan, expr, compiled, Processor::Where, [expr.predicate]) end |
#on_sort(plan, expr, compiled) ⇒ Object
37 38 39 40 41 42 43 |
# File 'lib/alf/sql/compiler.rb', line 37 def on_sort(plan, expr, compiled) if compiled.orderedby?(expr.ordering) rebind(plan, expr, compiled) else rewrite(plan, expr, compiled, Processor::OrderBy, [expr.ordering]) end end |
#on_union(plan, expr, left, right) ⇒ Object
def on_summarize(plan, expr, compiled)
# -> SQL's GROUP-BY
end
113 114 115 |
# File 'lib/alf/sql/compiler.rb', line 113 def on_union(plan, expr, left, right) rewrite(plan, expr, left, Processor::Merge, [:union, right.sexpr]) end |
#reuse(plan, cog) ⇒ Object
13 14 15 |
# File 'lib/alf/sql/compiler.rb', line 13 def reuse(plan, cog) rewrite(plan, cog.expr, cog, Processor::Requalify, []) end |
#supports_reuse? ⇒ Boolean
9 10 11 |
# File 'lib/alf/sql/compiler.rb', line 9 def supports_reuse? true end |