lib/tabulatr/tabulatr/finder.rb in tabulatr-0.1.3 vs lib/tabulatr/tabulatr/finder.rb in tabulatr-0.2.0

- old
+ new

@@ -22,22 +22,36 @@ #++ # These are extensions for use from ActionController instances module Tabulatr::Finder - require File.join(File.dirname(__FILE__), 'finder', 'find_for_active_record_table') - require File.join(File.dirname(__FILE__), 'finder', 'find_for_mongoid_table') + require File.join(File.dirname(__FILE__), 'finder', 'find_for_table') # compress the list of ids as good as I could imagine ;) # uses fancy base twisting def self.compress_id_list(list) - IdStuffer.stuff(list) + if list.length == 0 + "" + elsif list.first.is_a?(Fixnum) + IdStuffer.stuff(list) + else + "GzB" + Base64.encode64s( + Zlib::Deflate.deflate( + list.join(Tabulatr.table_form_options[:checked_separator]))) + end end # inverse of compress_id_list def self.uncompress_id_list(str) - IdStuffer.unstuff(str).map &:to_s + if !str.present? + [] + elsif str.starts_with?("GzB") + Zlib::Inflate.inflate(Base64.decode64(str[3..-1])) + .split(Tabulatr.table_form_options[:checked_separator]) + else + IdStuffer.unstuff(str) + end end class Invoker def initialize(batch_action, ids) @batch_action = batch_action.to_sym @@ -55,28 +69,48 @@ def self.class_to_param(klaz) klaz.to_s.downcase.gsub("/","_") end - def self.condition_from(n,v,c) + def self.condition_from(rel, typ, n, v) raise "SECURITY violation, field name is '#{n}'" unless /^[\d\w]+(\.[\d\w]+)?$/.match n @like ||= Tabulatr.sql_options[:like] - nc = c if v.is_a?(String) if v.present? - nc = [c[0] << " AND (#{n} = ?) ", c[1] << v] + if typ == :ar + rel = rel.where(n => v) + elsif typ == :mongoid + nn = n.split('.').last + rel = rel.where(nn => v) + else raise "Unknown db type '#{typ}'" + end end elsif v.is_a?(Hash) if v[:like] if v[:like].present? - nc = [c[0] << " AND (#{n} #{@like} ?) ", c[1] << "%#{v[:like]}%"] + if typ==:ar + rel = rel.where("#{n} #{@like} ?", "%#{v[:like]}%") + elsif typ==:mongoid + nn = n.split('.').last + rel = rel.where(nn => Regexp.new(v[:like])) + else + raise "Unknown db type '#{typ}'" + end end else - nc = [c[0] << " AND (#{n} >= ?) ", c[1] << "#{v[:from]}"] if v[:from].present? - nc = [nc[0] << " AND (#{n} <= ?) ", nc[1] << "#{v[:to]}"] if v[:to].present? + if typ==:ar + rel = rel.where("#{n} >= ?", "#{v[:from]}") if v[:from].present? + rel = rel.where("#{n} <= ?", "#{v[:to]}") if v[:to].present? + elsif typ==:mongoid + nn = n.split('.').last.to_sym + rel = rel.where(nn.gte => v[:from]) if v[:from].present? + rel = rel.where(nn.lte => v[:to]) if v[:to].present? + else + raise "Unknown db type '#{typ}'" + end end else raise "Wrong filter type: #{v.class}" end - nc + rel end end