Sha256: f1e8db98e83c81950d8f9ac2aed9991dfbfc97f26faacb21ff60bddc636145e6

Contents?: true

Size: 1.48 KB

Versions: 8

Compression:

Stored size: 1.48 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

      def build_predicate(k, v)
        if v.nil?
          "#{k} is null"
        else
          [k, 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

8 entries across 8 versions & 1 rubygems

Version Path
cmis-ruby-0.5.17 lib/cmis/utils.rb
cmis-ruby-0.5.16 lib/cmis/utils.rb
cmis-ruby-0.5.15 lib/cmis/utils.rb
cmis-ruby-0.5.14 lib/cmis/utils.rb
cmis-ruby-0.5.13 lib/cmis/utils.rb
cmis-ruby-0.5.12 lib/cmis/utils.rb
cmis-ruby-0.5.11 lib/cmis/utils.rb
cmis-ruby-0.5.10 lib/cmis/utils.rb