Sha256: e95744e4732b669ab33592e20298d68ddaa70d24753e8407afea4385a0ae14dc

Contents?: true

Size: 1.85 KB

Versions: 3

Compression:

Stored size: 1.85 KB

Contents

module CMIS
  module Utils
    module_function

    def build_query_statement(type_id, properties, *queried_properties)
      QueryStatementBuilder.new(type_id, properties, queried_properties).build
    end

    class QueryStatementBuilder
      def initialize(type_id, properties, queried_properties)
        @type_id = type_id
        @properties = properties
        @queried_properties = Array(queried_properties).join(', ')
        @queried_properties = '*' if @queried_properties.empty?
      end

      def build
        statement = "select #{@queried_properties} from #{@type_id}"
        clause = @properties.map { |k, v| build_predicate(k, v) }.join(' and ')
        statement << " where #{clause}" unless clause.empty?
        statement
      end

      private

      MAP = {
        '_eq' => ' =',
        '_not_eq' => ' <>',
        '_lt' => ' <',
        '_lteq' => ' <=',
        '_gt' => ' >',
        '_gteq' => ' >='
      }
      def build_predicate(k, v)
        key = k.to_s.dup
        key << '_eq' unless key.end_with?(*MAP.keys)
        if key.end_with?('_eq') && v.nil?
          "#{key[0..-4]} is null"
        else
          re = Regexp.new(MAP.keys.map { |x| Regexp.escape(x) + '$' }.join('|'))
          [key.gsub(re, MAP), normalize(v)].join(' ')
        end
      end

      def normalize(value)
        if value.respond_to?(:strftime) # datetime literal
          value = value.strftime('%Y-%m-%dT%H:%M:%S.%L')
          "TIMESTAMP '#{value}'"

        elsif value.is_a?(Numeric) # signed numeric literal
          value

        elsif value.is_a?(TrueClass) || value.is_a?(FalseClass) # boolean literal
          value

        else # treat as a character string literal
          value = value.to_s
          value.gsub!(/\\/, Regexp.escape('\\\\'))
          value.gsub!(/'/, Regexp.escape('\\\''))
          "'#{value}'"
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
cmis-ruby-0.5.20 lib/cmis/utils.rb
cmis-ruby-0.5.19 lib/cmis/utils.rb
cmis-ruby-0.5.18 lib/cmis/utils.rb