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