#Licensed to the Apache Software Foundation (ASF) under one or more contributor
#license agreements.  See the NOTICE.txt file distributed with this work for
#additional information regarding copyright ownership.  The ASF licenses this
#file to you under the Apache License, Version 2.0 (the "License"); you may not
#use this file except in compliance with the License.  You may obtain a copy of
#the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
#Unless required by applicable law or agreed to in writing, software
#distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
#License for the specific language governing permissions and limitations under
#the License.

require 'json'

def parse_sql(query)
  result = {}
  keywords = %w(select from where limit)
  current = nil
  query.downcase.split(/[\s,*]/).each do |ea|
    next if ea == '' || (current == 'select' && ea == 'distinct')
    if keywords.include? ea
      current = ea
    elsif current
      if current == 'select' and ea.start_with? "{"
        current = nil
        next
      end
      if result[current]
        if result[current].is_a? Array
          result[current] << ea
        else
          result[current] = [result[current]] << ea
        end
      else
        result[current] = (current == 'select') ? [ea] : ea
      end
    end
  end
  result
end

# returns a json string
def parse_data(input)
  return unless input
  # must be wrapped in {}
  input = "{#{input}}" unless input.start_with? '{' or input.start_with? '['
  # must be a json string or 1.9 hash format
  begin
    MultiJson.dump(eval(input))
  rescue SyntaxError
    input
  end
end
