module OracleSqlParser::Grammar

grammar Condition
  include OracleSqlParser::Grammar::Condition::Comparison
  include OracleSqlParser::Grammar::Condition::FloatingPoint
  include OracleSqlParser::Grammar::Condition::Multiset
  include OracleSqlParser::Grammar::Condition::PatternMatching
  include OracleSqlParser::Grammar::Condition::Null
  include OracleSqlParser::Grammar::Condition::Compound
  include OracleSqlParser::Grammar::Condition::Between
  include OracleSqlParser::Grammar::Condition::Exists
  include OracleSqlParser::Grammar::Condition::In
  include OracleSqlParser::Grammar::Condition::IsOfType

  # where
  rule where_clause
    where_keyword space? logical_condition {
      def ast
        OracleSqlParser::Ast::WhereClause[:condition => logical_condition.ast]
      end
    }
  end

  rule condition
    comparison_condition /
    floating_point_condition /
    model_condition /
    mutiset_condition /
    pattern_maching_condition /
    null_condition /
    xml_condition /
    compound_condition /
    between_condition /
    exists_condition /
    in_condition /
    is_of_type_condition {
        def ast
          super
        end
      }
  end

  rule logical_condition
    (
      op:not_keyword space? right:condition /
      left:condition space? op:and_keyword space? right:(logical_condition / condition ) /
      left:condition space? op:or_keyword space? right:(logical_condition / condition) /
      cond:condition
    ) {
      def ast
        if respond_to? :op
          if respond_to? :left
            OracleSqlParser::Ast::LogicalCondition[
              :left => left.ast,
              :op => op.ast,
              :right => right.ast]
          else
            OracleSqlParser::Ast::LogicalCondition[
              :op => op.ast,
              :right => right.ast]
          end
        else
          cond.ast
        end
      end
    }
  end

  rule model_condition
    'model_condition'
  end

  rule xml_condition
    'xml_condition'
  end

end

end