Sha256: 5d98b757698ae82168c754ee7d12adf73c9fdafb04178a65522854872ad214d3

Contents?: true

Size: 1.21 KB

Versions: 1

Compression:

Stored size: 1.21 KB

Contents

module SQLTree::Node

  class Join < Base

    leaf :join_type
    child :table_reference
    child :join_expression

    def initialize(values = {})
      values.each { |key, value| self.send(:"#{key}=", value) }
    end

    def to_sql(options = {})
      join_sql = join_type ? "#{join_type.to_s.upcase} " : ""
      join_sql << "JOIN #{table_reference.to_sql(options)} "
      join_sql << "ON #{join_expression.to_sql(options)}"
      join_sql
    end

    def table
      table_reference.table
    end

    def table_alias
      table_reference.table_alias
    end

    def self.parse(tokens)
      join = self.new

      if SQLTree::Token::FULL === tokens.peek
        join.join_type = :outer
        tokens.consume(SQLTree::Token::FULL, SQLTree::Token::OUTER)
      elsif [SQLTree::Token::OUTER, SQLTree::Token::INNER, SQLTree::Token::LEFT, SQLTree::Token::RIGHT].include?(tokens.peek.class)
        join.join_type = tokens.next.literal.downcase.to_sym
      end

      tokens.consume(SQLTree::Token::JOIN)
      join.table_reference = SQLTree::Node::TableReference.parse(tokens)
      tokens.consume(SQLTree::Token::ON)
      join.join_expression = SQLTree::Node::Expression.parse(tokens)

      return join
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sql_tree-0.1.1 lib/sql_tree/node/join.rb