module OracleSqlParser::Grammar::Condition

grammar IsOfType
  rule is_of_type_condition
    expr space?
    is_keyword space?
    not_keyword:not_keyword? space?
    of_keyword space?
    type_keyword:type_keyword? space?
    '(' space? types space? ')' {
      def ast
        OracleSqlParser::Ast::IsOfTypeCondition[
          :target => expr.ast,
          :is => is_keyword.ast,
          :not => not_keyword.ast,
          :of => of_keyword.ast,
          :type => type_keyword.ast,
          :types => types.ast
        ]
      end
    }
  end

  rule types
    only_and_type space? more:(',' space? only_and_type space?)* {
      def ast
        OracleSqlParser::Ast::Array[only_and_type.ast, *more_only_and_types.map(&:ast)]
      end

      def more_only_and_types
        more.elements.map(&:only_and_type)
      end
    }
  end

  rule only_and_type
    only_keyword:only_keyword? space? type {
      def ast
        OracleSqlParser::Ast::OnlyAndType[
          :only => only_keyword.ast,
          :type => type.ast
        ]
      end
    }
  end

  rule type
    schema_name '.' ident /
    ident {
      def ast
        OracleSqlParser::Ast::Identifier[:name => text_value]
      end
    }
  end

end

end