module Sequel::MSSQL::EmulateLateralWithApply

  1. lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb
Parent: MSSQL

Methods

Public Instance

  1. from
  2. join_table
  3. supports_lateral_subqueries?

Public Instance methods

from (*source, &block)

When a FROM entry uses a LATERAL subquery, convert that entry into a CROSS APPLY.

[show source]
# File lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb, line 53
def from(*source, &block)
  virtual_row_columns(source, block)
  lateral, source = source.partition{|t| t.is_a?(Sequel::Dataset) && t.opts[:lateral] || (t.is_a?(Sequel::SQL::AliasedExpression) && t.expression.is_a?(Sequel::Dataset) && t.expression.opts[:lateral])} unless source.empty?
  return super(*source, &nil) if !lateral || lateral.empty?

  ds = from(*source)
  lateral.each do |l|
    l = if l.is_a?(Sequel::SQL::AliasedExpression)
      l.expression.clone(:lateral=>nil).as(l.aliaz)
    else
      l.clone(:lateral=>nil)
    end
    ds = ds.cross_apply(l)
  end
  ds
end
join_table (type, table, expr=nil, *)

If the table is a dataset that uses LATERAL, convert it to a CROSS APPLY if it is a INNER or CROSS JOIN, and an OUTER APPLY if it is a LEFT JOIN.

[show source]
# File lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb, line 32
def join_table(type, table, expr=nil, *)
  if table.is_a?(Dataset) && table.opts[:lateral]
    table = table.clone(:lateral=>nil)
    case type
    when :inner
      type = :cross_apply
      table = table.where(expr)
      expr = nil
    when :cross
      type = :cross_apply
    when :left, :left_outer
      type = :outer_apply
      table = table.where(expr)
      expr = nil
    end
  end
  super
end
supports_lateral_subqueries? ()

MSSQL can emulate lateral subqueries via CROSS/OUTER APPLY when using this extension.

[show source]
# File lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb, line 72
def supports_lateral_subqueries?
  true
end