Sha256: 9b511f8223c7d4b58914b7238d634677b47bf8489bc1c45a86ea26be53a4e3df

Contents?: true

Size: 1.78 KB

Versions: 2

Compression:

Stored size: 1.78 KB

Contents

class Herder
  class Model
    class Query
      attr_accessor :model, :params

      def initialize model
        self.model = model
        self.params = {}
      end

      def where *prms
        params.merge!(sanitize prms)
        self
      end

      def each &block
        query.each &block
      end

      def to_s
        query.to_s
      end

      protected

      COMPARATORS = {
        "=" => "=",
        "!=" => "!=",
        "~" => "~",
        "!~" => "!~",
        "is" => "=",
        "isnt" => "!=",
        "was" => "~",
        "wasnt" => "!~"
      }.freeze

      def query
        @query ||= model.find(:all, params: params)
      end

      def sanitize params
        case params.class.name
        when "Hash"
          return params.stringify_keys
        when "String"
          return hashify params
        when "Array"
          if params.first.is_a?(Hash)
            return params.first.stringify_keys
          else
            return hashify(parameterize params)
          end
        end
      end

      def hashify params
        subqueries = params.split(/and/i)
        return subqueries.inject(Hash.new) do |results, subquery|
          tokens = subquery.strip.split(" ", 3)
          tokens[2].gsub!(/\A"|'/m, "")
          tokens[2].gsub!(/"|'\Z/m, "")
          append_param results, tokens
          results
        end
      end

      def parameterize params
        return params unless params.is_a?(Array)
        params[0].gsub(/ \?/, " %s") % params[1..-1]
      end

      def append_param results, tokens
        if tokens[0].starts_with? "interactions."
          comparator = COMPARATORS[tokens[1]] || tokens[1]
          results["#{tokens[0]} #{comparator}"] = tokens[2]
        else
          results[tokens[0]] = tokens[2]
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
herder-0.0.5 lib/herder/model/query.rb
herder-0.0.4 lib/herder/model/query.rb