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 |