schof-searchlogic 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +302 -0
- data/MIT-LICENSE +20 -0
- data/Manifest +157 -0
- data/README.rdoc +461 -0
- data/Rakefile +13 -0
- data/TODO.rdoc +4 -0
- data/init.rb +1 -0
- data/lib/searchlogic.rb +100 -0
- data/lib/searchlogic/active_record/associations.rb +52 -0
- data/lib/searchlogic/active_record/base.rb +224 -0
- data/lib/searchlogic/active_record/connection_adapters/mysql_adapter.rb +176 -0
- data/lib/searchlogic/active_record/connection_adapters/postgresql_adapter.rb +172 -0
- data/lib/searchlogic/active_record/connection_adapters/sqlite_adapter.rb +80 -0
- data/lib/searchlogic/condition/base.rb +165 -0
- data/lib/searchlogic/condition/begins_with.rb +17 -0
- data/lib/searchlogic/condition/blank.rb +21 -0
- data/lib/searchlogic/condition/child_of.rb +11 -0
- data/lib/searchlogic/condition/descendant_of.rb +11 -0
- data/lib/searchlogic/condition/ends_with.rb +17 -0
- data/lib/searchlogic/condition/equals.rb +33 -0
- data/lib/searchlogic/condition/greater_than.rb +15 -0
- data/lib/searchlogic/condition/greater_than_or_equal_to.rb +15 -0
- data/lib/searchlogic/condition/inclusive_descendant_of.rb +10 -0
- data/lib/searchlogic/condition/keywords.rb +47 -0
- data/lib/searchlogic/condition/less_than.rb +15 -0
- data/lib/searchlogic/condition/less_than_or_equal_to.rb +15 -0
- data/lib/searchlogic/condition/like.rb +15 -0
- data/lib/searchlogic/condition/nested_set.rb +17 -0
- data/lib/searchlogic/condition/nil.rb +21 -0
- data/lib/searchlogic/condition/not_begin_with.rb +20 -0
- data/lib/searchlogic/condition/not_blank.rb +19 -0
- data/lib/searchlogic/condition/not_end_with.rb +20 -0
- data/lib/searchlogic/condition/not_equal.rb +27 -0
- data/lib/searchlogic/condition/not_have_keywords.rb +20 -0
- data/lib/searchlogic/condition/not_like.rb +20 -0
- data/lib/searchlogic/condition/not_nil.rb +19 -0
- data/lib/searchlogic/condition/sibling_of.rb +14 -0
- data/lib/searchlogic/conditions/any_or_all.rb +42 -0
- data/lib/searchlogic/conditions/base.rb +244 -0
- data/lib/searchlogic/conditions/groups.rb +74 -0
- data/lib/searchlogic/conditions/magic_methods.rb +286 -0
- data/lib/searchlogic/conditions/multiparameter_attributes.rb +105 -0
- data/lib/searchlogic/conditions/protection.rb +36 -0
- data/lib/searchlogic/config.rb +31 -0
- data/lib/searchlogic/config/helpers.rb +338 -0
- data/lib/searchlogic/config/search.rb +53 -0
- data/lib/searchlogic/core_ext/hash.rb +75 -0
- data/lib/searchlogic/core_ext/object.rb +19 -0
- data/lib/searchlogic/helpers/control_types/link.rb +310 -0
- data/lib/searchlogic/helpers/control_types/links.rb +242 -0
- data/lib/searchlogic/helpers/control_types/remote_link.rb +87 -0
- data/lib/searchlogic/helpers/control_types/remote_links.rb +72 -0
- data/lib/searchlogic/helpers/control_types/remote_select.rb +36 -0
- data/lib/searchlogic/helpers/control_types/select.rb +82 -0
- data/lib/searchlogic/helpers/form.rb +208 -0
- data/lib/searchlogic/helpers/utilities.rb +197 -0
- data/lib/searchlogic/modifiers/absolute.rb +15 -0
- data/lib/searchlogic/modifiers/acos.rb +11 -0
- data/lib/searchlogic/modifiers/asin.rb +11 -0
- data/lib/searchlogic/modifiers/atan.rb +11 -0
- data/lib/searchlogic/modifiers/avg.rb +15 -0
- data/lib/searchlogic/modifiers/base.rb +27 -0
- data/lib/searchlogic/modifiers/ceil.rb +15 -0
- data/lib/searchlogic/modifiers/char_length.rb +15 -0
- data/lib/searchlogic/modifiers/cos.rb +15 -0
- data/lib/searchlogic/modifiers/cot.rb +15 -0
- data/lib/searchlogic/modifiers/count.rb +11 -0
- data/lib/searchlogic/modifiers/day_of_month.rb +15 -0
- data/lib/searchlogic/modifiers/day_of_week.rb +15 -0
- data/lib/searchlogic/modifiers/day_of_year.rb +15 -0
- data/lib/searchlogic/modifiers/degrees.rb +11 -0
- data/lib/searchlogic/modifiers/exp.rb +15 -0
- data/lib/searchlogic/modifiers/floor.rb +15 -0
- data/lib/searchlogic/modifiers/hex.rb +11 -0
- data/lib/searchlogic/modifiers/hour.rb +11 -0
- data/lib/searchlogic/modifiers/log.rb +15 -0
- data/lib/searchlogic/modifiers/log10.rb +11 -0
- data/lib/searchlogic/modifiers/log2.rb +11 -0
- data/lib/searchlogic/modifiers/lower.rb +15 -0
- data/lib/searchlogic/modifiers/ltrim.rb +15 -0
- data/lib/searchlogic/modifiers/md5.rb +11 -0
- data/lib/searchlogic/modifiers/microseconds.rb +11 -0
- data/lib/searchlogic/modifiers/milliseconds.rb +11 -0
- data/lib/searchlogic/modifiers/minute.rb +15 -0
- data/lib/searchlogic/modifiers/month.rb +15 -0
- data/lib/searchlogic/modifiers/octal.rb +15 -0
- data/lib/searchlogic/modifiers/radians.rb +11 -0
- data/lib/searchlogic/modifiers/round.rb +11 -0
- data/lib/searchlogic/modifiers/rtrim.rb +15 -0
- data/lib/searchlogic/modifiers/second.rb +15 -0
- data/lib/searchlogic/modifiers/sign.rb +11 -0
- data/lib/searchlogic/modifiers/sin.rb +11 -0
- data/lib/searchlogic/modifiers/square_root.rb +15 -0
- data/lib/searchlogic/modifiers/sum.rb +11 -0
- data/lib/searchlogic/modifiers/tan.rb +15 -0
- data/lib/searchlogic/modifiers/trim.rb +15 -0
- data/lib/searchlogic/modifiers/upper.rb +15 -0
- data/lib/searchlogic/modifiers/week.rb +11 -0
- data/lib/searchlogic/modifiers/year.rb +11 -0
- data/lib/searchlogic/search/base.rb +148 -0
- data/lib/searchlogic/search/conditions.rb +53 -0
- data/lib/searchlogic/search/ordering.rb +244 -0
- data/lib/searchlogic/search/pagination.rb +121 -0
- data/lib/searchlogic/search/protection.rb +89 -0
- data/lib/searchlogic/search/searching.rb +32 -0
- data/lib/searchlogic/shared/utilities.rb +56 -0
- data/lib/searchlogic/shared/virtual_classes.rb +39 -0
- data/lib/searchlogic/version.rb +79 -0
- data/searchlogic.gemspec +41 -0
- data/test/active_record_tests/associations_test.rb +94 -0
- data/test/active_record_tests/base_test.rb +115 -0
- data/test/condition_tests/base_test.rb +54 -0
- data/test/condition_tests/begins_with_test.rb +11 -0
- data/test/condition_tests/blank_test.rb +31 -0
- data/test/condition_tests/child_of_test.rb +17 -0
- data/test/condition_tests/descendant_of_test.rb +12 -0
- data/test/condition_tests/ends_with_test.rb +11 -0
- data/test/condition_tests/equals_test.rb +28 -0
- data/test/condition_tests/greater_than_or_equal_to_test.rb +11 -0
- data/test/condition_tests/greater_than_test.rb +11 -0
- data/test/condition_tests/inclusive_descendant_of_test.rb +12 -0
- data/test/condition_tests/keywords_test.rb +23 -0
- data/test/condition_tests/less_than_or_equal_to_test.rb +11 -0
- data/test/condition_tests/less_than_test.rb +11 -0
- data/test/condition_tests/like_test.rb +11 -0
- data/test/condition_tests/nil_test.rb +31 -0
- data/test/condition_tests/not_begin_with_test.rb +8 -0
- data/test/condition_tests/not_blank_test.rb +8 -0
- data/test/condition_tests/not_end_with_test.rb +8 -0
- data/test/condition_tests/not_equal_test.rb +19 -0
- data/test/condition_tests/not_have_keywords_test.rb +8 -0
- data/test/condition_tests/not_like_test.rb +8 -0
- data/test/condition_tests/not_nil_test.rb +13 -0
- data/test/condition_tests/sibling_of_test.rb +15 -0
- data/test/conditions_tests/any_or_all_test.rb +23 -0
- data/test/conditions_tests/base_test.rb +185 -0
- data/test/conditions_tests/groups_test.rb +68 -0
- data/test/conditions_tests/magic_methods_test.rb +36 -0
- data/test/conditions_tests/multiparameter_attributes_test.rb +15 -0
- data/test/conditions_tests/protection_test.rb +18 -0
- data/test/config_test.rb +23 -0
- data/test/fixtures/accounts.yml +12 -0
- data/test/fixtures/animals.yml +7 -0
- data/test/fixtures/orders.yml +12 -0
- data/test/fixtures/user_groups.yml +5 -0
- data/test/fixtures/users.yml +45 -0
- data/test/libs/awesome_nested_set.rb +545 -0
- data/test/libs/awesome_nested_set/compatability.rb +29 -0
- data/test/libs/awesome_nested_set/helper.rb +40 -0
- data/test/libs/awesome_nested_set/named_scope.rb +140 -0
- data/test/libs/rexml_fix.rb +14 -0
- data/test/modifier_tests/day_of_month_test.rb +16 -0
- data/test/search_tests/base_test.rb +241 -0
- data/test/search_tests/conditions_test.rb +21 -0
- data/test/search_tests/ordering_test.rb +167 -0
- data/test/search_tests/pagination_test.rb +74 -0
- data/test/search_tests/protection_test.rb +26 -0
- data/test/test_helper.rb +116 -0
- metadata +385 -0
@@ -0,0 +1,121 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Search
|
3
|
+
# = Searchlogic Pagination
|
4
|
+
#
|
5
|
+
# Adds in pagination functionality to searchlogic
|
6
|
+
module Pagination
|
7
|
+
def self.included(klass)
|
8
|
+
klass.class_eval do
|
9
|
+
alias_method_chain :limit=, :pagination
|
10
|
+
alias_method_chain :offset=, :pagination
|
11
|
+
alias_method :per_page, :limit
|
12
|
+
alias_method :per_page=, :limit=
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def limit_with_pagination=(value) # :nodoc:
|
17
|
+
r_value = self.limit_without_pagination = value
|
18
|
+
@page_count = nil
|
19
|
+
if @set_page
|
20
|
+
self.page = (@queued_page || @page) # retry setting page
|
21
|
+
else
|
22
|
+
@page = nil # the memoized page is invalid, so reset it
|
23
|
+
end
|
24
|
+
r_value
|
25
|
+
end
|
26
|
+
|
27
|
+
def offset_with_pagination=(value) #:nodoc
|
28
|
+
r_value = self.offset_without_pagination = value
|
29
|
+
@set_page = @queued_page = @page = nil
|
30
|
+
r_value
|
31
|
+
end
|
32
|
+
|
33
|
+
# The current page that the search is on
|
34
|
+
def page
|
35
|
+
@page ||= (offset.blank? || limit.blank?) ? 1 : (offset.to_f / limit).floor + 1
|
36
|
+
end
|
37
|
+
alias_method :current_page, :page
|
38
|
+
|
39
|
+
# Lets you change the page for the next search
|
40
|
+
def page=(value)
|
41
|
+
@set_page = true
|
42
|
+
|
43
|
+
if value.blank?
|
44
|
+
value = nil
|
45
|
+
@page = value
|
46
|
+
return @offset = @page
|
47
|
+
end
|
48
|
+
|
49
|
+
v = value.to_i
|
50
|
+
|
51
|
+
if limit.blank?
|
52
|
+
@queued_page = v
|
53
|
+
@page = 1
|
54
|
+
@offset = nil
|
55
|
+
else
|
56
|
+
@queued_page = nil
|
57
|
+
@page = v
|
58
|
+
v -= 1 unless v == 0
|
59
|
+
@offset = v * limit
|
60
|
+
end
|
61
|
+
value
|
62
|
+
end
|
63
|
+
|
64
|
+
# The total number of pages in your next search
|
65
|
+
def page_count
|
66
|
+
@page_count ||= (per_page.blank? || per_page <= 0) ? 1 : (count / per_page.to_f).ceil
|
67
|
+
end
|
68
|
+
alias_method :page_total, :page_count
|
69
|
+
|
70
|
+
# Always returns 1, this is a convenience method
|
71
|
+
def first_page
|
72
|
+
1
|
73
|
+
end
|
74
|
+
|
75
|
+
# Changes the page to 1 and then runs the "all" search. What's different about this method is that it does not raise an exception if you are on the first page. Unlike prev_page! and next_page!
|
76
|
+
# I don't think an exception raised is warranted, because you are expecting the same results each time it is ran.
|
77
|
+
def first_page!
|
78
|
+
self.page = first_page
|
79
|
+
all
|
80
|
+
end
|
81
|
+
|
82
|
+
# Changes the page to the page - 1
|
83
|
+
def prev_page
|
84
|
+
self.page - 1
|
85
|
+
end
|
86
|
+
|
87
|
+
# Changes the page to page - 1 and runs the "all" search. Be careful with this method because if you are on the first page an exception is raised telling you that you are on the first page.
|
88
|
+
# I thought about just running the first page search again, but that seems confusing and unexpected.
|
89
|
+
def prev_page!
|
90
|
+
raise("You are on the first page") if page == first_page
|
91
|
+
self.page = prev_page
|
92
|
+
all
|
93
|
+
end
|
94
|
+
|
95
|
+
# Change the page to page + 1
|
96
|
+
def next_page
|
97
|
+
self.page + 1
|
98
|
+
end
|
99
|
+
|
100
|
+
# Changes the page to page + 1 and calls the "all" method. Be careful with this method because if you are on the last page an exception is raised telling you that you are on the last page.
|
101
|
+
# I thought about just running the lat page search again, but that seems confusing and unexpected.
|
102
|
+
def next_page!
|
103
|
+
raise("You are on the last page") if page == last_page
|
104
|
+
self.page = next_page
|
105
|
+
all
|
106
|
+
end
|
107
|
+
|
108
|
+
# Always returns the page_count, this is a convenience method
|
109
|
+
def last_page
|
110
|
+
page_count
|
111
|
+
end
|
112
|
+
|
113
|
+
# Changes the page to the last page and runs the "all" search. What's different about this method is that it does not raise an exception if you are on the last page. Unlike prev_page! and next_page!
|
114
|
+
# I don't think an exception raised is warranted, because you are expecting the same results each time it is ran.
|
115
|
+
def last_page!
|
116
|
+
self.page = last_page
|
117
|
+
all
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Search
|
3
|
+
# = Searchlogic Protection
|
4
|
+
#
|
5
|
+
# This adds protection during mass asignments *only*. This allows you to pass a params object when doing mass assignments and not have to worry about Billy 13 year old adding in SQL injections.
|
6
|
+
# There is a section in the readme that covers protection but to reiterate:
|
7
|
+
#
|
8
|
+
# === Protected
|
9
|
+
#
|
10
|
+
# User.new_search(params[:search])
|
11
|
+
# User.new_conditions(params[:search])
|
12
|
+
#
|
13
|
+
# search.options = params[:search]
|
14
|
+
# conditions.conditions = params[:conditions]
|
15
|
+
#
|
16
|
+
# === NOT Protected
|
17
|
+
#
|
18
|
+
# User.new_search!(params[:search])
|
19
|
+
# User.new_conditions!(params[:search])
|
20
|
+
# User.find(:all, params[:search])
|
21
|
+
# User.first(params[:search])
|
22
|
+
# User.all(params[:search])
|
23
|
+
module Protection
|
24
|
+
# Options that are allowed when protecting against SQL injections (still checked though)
|
25
|
+
SAFE_OPTIONS = Base::SPECIAL_FIND_OPTIONS + [:conditions, :limit, :offset] - [:priority_order]
|
26
|
+
|
27
|
+
VULNERABLE_FIND_OPTIONS = Base::AR_FIND_OPTIONS - SAFE_OPTIONS + [:priority_order]
|
28
|
+
|
29
|
+
VULNERABLE_CALCULATIONS_OPTIONS = Base::AR_CALCULATIONS_OPTIONS - SAFE_OPTIONS + [:priority_order]
|
30
|
+
|
31
|
+
# Options that are not allowed, at all, when protecting against SQL injections
|
32
|
+
VULNERABLE_OPTIONS = Base::OPTIONS - SAFE_OPTIONS
|
33
|
+
|
34
|
+
def self.included(klass)
|
35
|
+
klass.class_eval do
|
36
|
+
attr_reader :protect
|
37
|
+
alias_method_chain :options=, :protection
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def options_with_protection=(values) # :nodoc:
|
42
|
+
return unless values.is_a?(Hash)
|
43
|
+
self.protect = values.delete(:protect) if values.has_key?(:protect) # make sure we do this first
|
44
|
+
frisk!(values) if protect?
|
45
|
+
self.options_without_protection = values
|
46
|
+
end
|
47
|
+
|
48
|
+
# Accepts a boolean. Will protect mass assignemnts if set to true, and unprotect mass assignments if set to false
|
49
|
+
def protect=(value)
|
50
|
+
conditions.protect = value
|
51
|
+
@protect = value
|
52
|
+
end
|
53
|
+
|
54
|
+
# Convenience methof for determing if the search is protected or not.
|
55
|
+
def protect?
|
56
|
+
protect == true
|
57
|
+
end
|
58
|
+
alias_method :protected?, :protect?
|
59
|
+
|
60
|
+
private
|
61
|
+
def order_by_safe?(order_by, alt_klass = nil)
|
62
|
+
return true if order_by.blank?
|
63
|
+
|
64
|
+
k = alt_klass || klass
|
65
|
+
column_names = k.column_names
|
66
|
+
|
67
|
+
[order_by].flatten.each do |column|
|
68
|
+
case column
|
69
|
+
when Hash
|
70
|
+
reflection = k.reflect_on_association(column.keys.first.to_sym)
|
71
|
+
return false unless reflection
|
72
|
+
return false unless order_by_safe?(column.values.first, reflection.klass)
|
73
|
+
when Array
|
74
|
+
return false unless order_by_safe?(column)
|
75
|
+
else
|
76
|
+
return false unless column_names.include?(column.to_s)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
true
|
81
|
+
end
|
82
|
+
|
83
|
+
def frisk!(options)
|
84
|
+
options.symbolize_keys.fast_assert_valid_keys(SAFE_OPTIONS)
|
85
|
+
raise(ArgumentError, ":order_by can only contain colum names and relationships in the string, hash, or array format. You are trying to pass a value that does not meet this criteria.") unless order_by_safe?(get_order_by_value(options[:order_by]))
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Search
|
3
|
+
# = Searchlogic Searching
|
4
|
+
#
|
5
|
+
# Implements searching functionality for searchlogic. Searchlogic::Search::Base and Searchlogic::Conditions::Base can both search and include
|
6
|
+
# this module.
|
7
|
+
module Searching
|
8
|
+
# Use these methods just like you would in ActiveRecord
|
9
|
+
SEARCH_METHODS = [:all, :find, :first]
|
10
|
+
CALCULATION_METHODS = [:average, :calculate, :count, :maximum, :minimum, :sum]
|
11
|
+
|
12
|
+
(SEARCH_METHODS + CALCULATION_METHODS).each do |method|
|
13
|
+
class_eval <<-"end_eval", __FILE__, __LINE__
|
14
|
+
def #{method}(*args)
|
15
|
+
find_options = {}
|
16
|
+
options = args.extract_options! # can't pass options, your options are in the search
|
17
|
+
klass.send(:with_scope, :find => acting_as_filter? ? {} : scope) do
|
18
|
+
options = sanitize(#{SEARCH_METHODS.include?(method)})
|
19
|
+
if #{CALCULATION_METHODS.include?(method)}
|
20
|
+
options[:distinct] = true if #{method == :count} && !joins.blank? && Config.search.remove_duplicates?
|
21
|
+
args[0] = klass.column_names.first if [nil, :all].include?(args[0])
|
22
|
+
end
|
23
|
+
args << options
|
24
|
+
results = klass.#{method}(*args)
|
25
|
+
results
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end_eval
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Shared
|
3
|
+
module Utilities # :nodoc:
|
4
|
+
private
|
5
|
+
def merge_conditions(*conditions)
|
6
|
+
options = conditions.extract_options!
|
7
|
+
conditions.delete_if { |condition| condition.blank? }
|
8
|
+
return if conditions.blank?
|
9
|
+
return conditions.first if conditions.size == 1
|
10
|
+
|
11
|
+
conditions_strs = []
|
12
|
+
conditions_subs = []
|
13
|
+
|
14
|
+
conditions.each do |condition|
|
15
|
+
next if condition.blank?
|
16
|
+
arr_condition = condition.is_a?(Array) ? condition : [condition]
|
17
|
+
conditions_strs << arr_condition.first
|
18
|
+
conditions_subs += arr_condition[1..-1]
|
19
|
+
end
|
20
|
+
|
21
|
+
return if conditions_strs.blank?
|
22
|
+
|
23
|
+
join = options[:any] ? " OR " : " AND "
|
24
|
+
conditions_str = conditions_strs.join(join)
|
25
|
+
|
26
|
+
return conditions_str if conditions_subs.blank?
|
27
|
+
|
28
|
+
[conditions_str, *conditions_subs]
|
29
|
+
end
|
30
|
+
|
31
|
+
def scope_condition(condition)
|
32
|
+
arr_condition = condition.is_a?(Array) ? condition : [condition]
|
33
|
+
arr_condition[0] = "(#{arr_condition[0]})"
|
34
|
+
arr_condition.size == 1 ? arr_condition.first : arr_condition
|
35
|
+
end
|
36
|
+
|
37
|
+
def merge_joins(*joins)
|
38
|
+
joins.delete_if { |join| join.blank? }
|
39
|
+
return if joins.blank?
|
40
|
+
return joins.first if joins.size == 1
|
41
|
+
|
42
|
+
new_joins = []
|
43
|
+
joins.each do |join|
|
44
|
+
case join
|
45
|
+
when Array
|
46
|
+
new_joins += join
|
47
|
+
else
|
48
|
+
new_joins << join
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
new_joins.compact.uniq
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Shared
|
3
|
+
# = Searchlogic Virtual Classes
|
4
|
+
#
|
5
|
+
# Creates virtual classes for each model, to implementing a type of caching. So that object instantiation for searchlogic searches is cached. This is lazy, meaning
|
6
|
+
# it will only cache when it needs. So the first instantion will be much slow than the following ones. This is cached in the RAM, so if the process is restarted the caching is cleared.
|
7
|
+
module VirtualClasses
|
8
|
+
def self.included(klass)
|
9
|
+
klass.extend ClassMethods
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods
|
13
|
+
# Creates virtual classes for the class passed to it. This is a neccesity for keeping dynamically created method
|
14
|
+
# names specific to models. It provides caching and helps a lot with performance.
|
15
|
+
def create_virtual_class(model_class)
|
16
|
+
class_search_name = "::Searchlogic::Cache::#{model_class.name.gsub("::", "")}" + name.split(/::/)[1]
|
17
|
+
|
18
|
+
begin
|
19
|
+
eval(class_search_name)
|
20
|
+
rescue NameError
|
21
|
+
eval <<-end_eval
|
22
|
+
class #{class_search_name} < ::#{name}
|
23
|
+
def self.klass
|
24
|
+
#{model_class.name}
|
25
|
+
end
|
26
|
+
|
27
|
+
def klass
|
28
|
+
#{model_class.name}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
#{class_search_name}
|
33
|
+
end_eval
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# (The MIT License)
|
2
|
+
#
|
3
|
+
# Copyright (c) 2008 Jamis Buck <jamis@37signals.com>,
|
4
|
+
# with modifications by Bruce Williams <bruce@fiveruns.com>
|
5
|
+
#
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
7
|
+
# a copy of this software and associated documentation files (the
|
8
|
+
# 'Software'), to deal in the Software without restriction, including
|
9
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
10
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
11
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
12
|
+
# the following conditions:
|
13
|
+
#
|
14
|
+
# The above copyright notice and this permission notice shall be
|
15
|
+
# included in all copies or substantial portions of the Software.
|
16
|
+
#
|
17
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
18
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
19
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
20
|
+
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
21
|
+
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
22
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
23
|
+
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
24
|
+
module Searchlogic
|
25
|
+
# = Version
|
26
|
+
#
|
27
|
+
# A class for describing the current version of a library. The version
|
28
|
+
# consists of three parts: the +major+ number, the +minor+ number, and the
|
29
|
+
# +tiny+ (or +patch+) number.
|
30
|
+
class Version
|
31
|
+
|
32
|
+
include Comparable
|
33
|
+
|
34
|
+
# A convenience method for instantiating a new Version instance with the
|
35
|
+
# given +major+, +minor+, and +tiny+ components.
|
36
|
+
def self.[](major, minor, tiny)
|
37
|
+
new(major, minor, tiny)
|
38
|
+
end
|
39
|
+
|
40
|
+
attr_reader :major, :minor, :tiny
|
41
|
+
|
42
|
+
# Create a new Version object with the given components.
|
43
|
+
def initialize(major, minor, tiny)
|
44
|
+
@major, @minor, @tiny = major, minor, tiny
|
45
|
+
end
|
46
|
+
|
47
|
+
# Compare this version to the given +version+ object.
|
48
|
+
def <=>(version)
|
49
|
+
to_i <=> version.to_i
|
50
|
+
end
|
51
|
+
|
52
|
+
# Converts this version object to a string, where each of the three
|
53
|
+
# version components are joined by the '.' character. E.g., 2.0.0.
|
54
|
+
def to_s
|
55
|
+
@to_s ||= [@major, @minor, @tiny].join(".")
|
56
|
+
end
|
57
|
+
|
58
|
+
# Converts this version to a canonical integer that may be compared
|
59
|
+
# against other version objects.
|
60
|
+
def to_i
|
61
|
+
@to_i ||= @major * 1_000_000 + @minor * 1_000 + @tiny
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_a
|
65
|
+
[@major, @minor, @tiny]
|
66
|
+
end
|
67
|
+
|
68
|
+
MAJOR = 1
|
69
|
+
MINOR = 6
|
70
|
+
TINY = 4
|
71
|
+
|
72
|
+
# The current version as a Version instance
|
73
|
+
CURRENT = new(MAJOR, MINOR, TINY)
|
74
|
+
# The current version as a String
|
75
|
+
STRING = CURRENT.to_s
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
data/searchlogic.gemspec
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{searchlogic}
|
5
|
+
s.version = "0.0.2"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Ben Johnson of Binary Logic"]
|
9
|
+
s.date = %q{2009-03-03}
|
10
|
+
s.description = %q{Object based ActiveRecord searching, ordering, pagination, and more!}
|
11
|
+
s.email = %q{bjohnson@binarylogic.com}
|
12
|
+
s.extra_rdoc_files = ["CHANGELOG.rdoc", "lib/searchlogic/active_record/associations.rb", "lib/searchlogic/active_record/base.rb", "lib/searchlogic/active_record/connection_adapters/mysql_adapter.rb", "lib/searchlogic/active_record/connection_adapters/postgresql_adapter.rb", "lib/searchlogic/active_record/connection_adapters/sqlite_adapter.rb", "lib/searchlogic/condition/base.rb", "lib/searchlogic/condition/begins_with.rb", "lib/searchlogic/condition/blank.rb", "lib/searchlogic/condition/child_of.rb", "lib/searchlogic/condition/descendant_of.rb", "lib/searchlogic/condition/ends_with.rb", "lib/searchlogic/condition/equals.rb", "lib/searchlogic/condition/greater_than.rb", "lib/searchlogic/condition/greater_than_or_equal_to.rb", "lib/searchlogic/condition/inclusive_descendant_of.rb", "lib/searchlogic/condition/keywords.rb", "lib/searchlogic/condition/less_than.rb", "lib/searchlogic/condition/less_than_or_equal_to.rb", "lib/searchlogic/condition/like.rb", "lib/searchlogic/condition/nested_set.rb", "lib/searchlogic/condition/nil.rb", "lib/searchlogic/condition/not_begin_with.rb", "lib/searchlogic/condition/not_blank.rb", "lib/searchlogic/condition/not_end_with.rb", "lib/searchlogic/condition/not_equal.rb", "lib/searchlogic/condition/not_have_keywords.rb", "lib/searchlogic/condition/not_like.rb", "lib/searchlogic/condition/not_nil.rb", "lib/searchlogic/condition/sibling_of.rb", "lib/searchlogic/conditions/any_or_all.rb", "lib/searchlogic/conditions/base.rb", "lib/searchlogic/conditions/groups.rb", "lib/searchlogic/conditions/magic_methods.rb", "lib/searchlogic/conditions/multiparameter_attributes.rb", "lib/searchlogic/conditions/protection.rb", "lib/searchlogic/config/helpers.rb", "lib/searchlogic/config/search.rb", "lib/searchlogic/config.rb", "lib/searchlogic/core_ext/hash.rb", "lib/searchlogic/core_ext/object.rb", "lib/searchlogic/helpers/control_types/link.rb", "lib/searchlogic/helpers/control_types/links.rb", "lib/searchlogic/helpers/control_types/remote_link.rb", "lib/searchlogic/helpers/control_types/remote_links.rb", "lib/searchlogic/helpers/control_types/remote_select.rb", "lib/searchlogic/helpers/control_types/select.rb", "lib/searchlogic/helpers/form.rb", "lib/searchlogic/helpers/utilities.rb", "lib/searchlogic/modifiers/absolute.rb", "lib/searchlogic/modifiers/acos.rb", "lib/searchlogic/modifiers/asin.rb", "lib/searchlogic/modifiers/atan.rb", "lib/searchlogic/modifiers/avg.rb", "lib/searchlogic/modifiers/base.rb", "lib/searchlogic/modifiers/ceil.rb", "lib/searchlogic/modifiers/char_length.rb", "lib/searchlogic/modifiers/cos.rb", "lib/searchlogic/modifiers/cot.rb", "lib/searchlogic/modifiers/count.rb", "lib/searchlogic/modifiers/day_of_month.rb", "lib/searchlogic/modifiers/day_of_week.rb", "lib/searchlogic/modifiers/day_of_year.rb", "lib/searchlogic/modifiers/degrees.rb", "lib/searchlogic/modifiers/exp.rb", "lib/searchlogic/modifiers/floor.rb", "lib/searchlogic/modifiers/hex.rb", "lib/searchlogic/modifiers/hour.rb", "lib/searchlogic/modifiers/log.rb", "lib/searchlogic/modifiers/log10.rb", "lib/searchlogic/modifiers/log2.rb", "lib/searchlogic/modifiers/lower.rb", "lib/searchlogic/modifiers/ltrim.rb", "lib/searchlogic/modifiers/md5.rb", "lib/searchlogic/modifiers/microseconds.rb", "lib/searchlogic/modifiers/milliseconds.rb", "lib/searchlogic/modifiers/minute.rb", "lib/searchlogic/modifiers/month.rb", "lib/searchlogic/modifiers/octal.rb", "lib/searchlogic/modifiers/radians.rb", "lib/searchlogic/modifiers/round.rb", "lib/searchlogic/modifiers/rtrim.rb", "lib/searchlogic/modifiers/second.rb", "lib/searchlogic/modifiers/sign.rb", "lib/searchlogic/modifiers/sin.rb", "lib/searchlogic/modifiers/square_root.rb", "lib/searchlogic/modifiers/sum.rb", "lib/searchlogic/modifiers/tan.rb", "lib/searchlogic/modifiers/trim.rb", "lib/searchlogic/modifiers/upper.rb", "lib/searchlogic/modifiers/week.rb", "lib/searchlogic/modifiers/year.rb", "lib/searchlogic/search/base.rb", "lib/searchlogic/search/conditions.rb", "lib/searchlogic/search/ordering.rb", "lib/searchlogic/search/pagination.rb", "lib/searchlogic/search/protection.rb", "lib/searchlogic/search/searching.rb", "lib/searchlogic/shared/utilities.rb", "lib/searchlogic/shared/virtual_classes.rb", "lib/searchlogic/version.rb", "lib/searchlogic.rb", "README.rdoc", "TODO.rdoc"]
|
13
|
+
s.files = ["CHANGELOG.rdoc", "init.rb", "lib/searchlogic/active_record/associations.rb", "lib/searchlogic/active_record/base.rb", "lib/searchlogic/active_record/connection_adapters/mysql_adapter.rb", "lib/searchlogic/active_record/connection_adapters/postgresql_adapter.rb", "lib/searchlogic/active_record/connection_adapters/sqlite_adapter.rb", "lib/searchlogic/condition/base.rb", "lib/searchlogic/condition/begins_with.rb", "lib/searchlogic/condition/blank.rb", "lib/searchlogic/condition/child_of.rb", "lib/searchlogic/condition/descendant_of.rb", "lib/searchlogic/condition/ends_with.rb", "lib/searchlogic/condition/equals.rb", "lib/searchlogic/condition/greater_than.rb", "lib/searchlogic/condition/greater_than_or_equal_to.rb", "lib/searchlogic/condition/inclusive_descendant_of.rb", "lib/searchlogic/condition/keywords.rb", "lib/searchlogic/condition/less_than.rb", "lib/searchlogic/condition/less_than_or_equal_to.rb", "lib/searchlogic/condition/like.rb", "lib/searchlogic/condition/nested_set.rb", "lib/searchlogic/condition/nil.rb", "lib/searchlogic/condition/not_begin_with.rb", "lib/searchlogic/condition/not_blank.rb", "lib/searchlogic/condition/not_end_with.rb", "lib/searchlogic/condition/not_equal.rb", "lib/searchlogic/condition/not_have_keywords.rb", "lib/searchlogic/condition/not_like.rb", "lib/searchlogic/condition/not_nil.rb", "lib/searchlogic/condition/sibling_of.rb", "lib/searchlogic/conditions/any_or_all.rb", "lib/searchlogic/conditions/base.rb", "lib/searchlogic/conditions/groups.rb", "lib/searchlogic/conditions/magic_methods.rb", "lib/searchlogic/conditions/multiparameter_attributes.rb", "lib/searchlogic/conditions/protection.rb", "lib/searchlogic/config/helpers.rb", "lib/searchlogic/config/search.rb", "lib/searchlogic/config.rb", "lib/searchlogic/core_ext/hash.rb", "lib/searchlogic/core_ext/object.rb", "lib/searchlogic/helpers/control_types/link.rb", "lib/searchlogic/helpers/control_types/links.rb", "lib/searchlogic/helpers/control_types/remote_link.rb", "lib/searchlogic/helpers/control_types/remote_links.rb", "lib/searchlogic/helpers/control_types/remote_select.rb", "lib/searchlogic/helpers/control_types/select.rb", "lib/searchlogic/helpers/form.rb", "lib/searchlogic/helpers/utilities.rb", "lib/searchlogic/modifiers/absolute.rb", "lib/searchlogic/modifiers/acos.rb", "lib/searchlogic/modifiers/asin.rb", "lib/searchlogic/modifiers/atan.rb", "lib/searchlogic/modifiers/avg.rb", "lib/searchlogic/modifiers/base.rb", "lib/searchlogic/modifiers/ceil.rb", "lib/searchlogic/modifiers/char_length.rb", "lib/searchlogic/modifiers/cos.rb", "lib/searchlogic/modifiers/cot.rb", "lib/searchlogic/modifiers/count.rb", "lib/searchlogic/modifiers/day_of_month.rb", "lib/searchlogic/modifiers/day_of_week.rb", "lib/searchlogic/modifiers/day_of_year.rb", "lib/searchlogic/modifiers/degrees.rb", "lib/searchlogic/modifiers/exp.rb", "lib/searchlogic/modifiers/floor.rb", "lib/searchlogic/modifiers/hex.rb", "lib/searchlogic/modifiers/hour.rb", "lib/searchlogic/modifiers/log.rb", "lib/searchlogic/modifiers/log10.rb", "lib/searchlogic/modifiers/log2.rb", "lib/searchlogic/modifiers/lower.rb", "lib/searchlogic/modifiers/ltrim.rb", "lib/searchlogic/modifiers/md5.rb", "lib/searchlogic/modifiers/microseconds.rb", "lib/searchlogic/modifiers/milliseconds.rb", "lib/searchlogic/modifiers/minute.rb", "lib/searchlogic/modifiers/month.rb", "lib/searchlogic/modifiers/octal.rb", "lib/searchlogic/modifiers/radians.rb", "lib/searchlogic/modifiers/round.rb", "lib/searchlogic/modifiers/rtrim.rb", "lib/searchlogic/modifiers/second.rb", "lib/searchlogic/modifiers/sign.rb", "lib/searchlogic/modifiers/sin.rb", "lib/searchlogic/modifiers/square_root.rb", "lib/searchlogic/modifiers/sum.rb", "lib/searchlogic/modifiers/tan.rb", "lib/searchlogic/modifiers/trim.rb", "lib/searchlogic/modifiers/upper.rb", "lib/searchlogic/modifiers/week.rb", "lib/searchlogic/modifiers/year.rb", "lib/searchlogic/search/base.rb", "lib/searchlogic/search/conditions.rb", "lib/searchlogic/search/ordering.rb", "lib/searchlogic/search/pagination.rb", "lib/searchlogic/search/protection.rb", "lib/searchlogic/search/searching.rb", "lib/searchlogic/shared/utilities.rb", "lib/searchlogic/shared/virtual_classes.rb", "lib/searchlogic/version.rb", "lib/searchlogic.rb", "Manifest", "MIT-LICENSE", "Rakefile", "README.rdoc", "test/active_record_tests/associations_test.rb", "test/active_record_tests/base_test.rb", "test/condition_tests/base_test.rb", "test/condition_tests/begins_with_test.rb", "test/condition_tests/blank_test.rb", "test/condition_tests/child_of_test.rb", "test/condition_tests/descendant_of_test.rb", "test/condition_tests/ends_with_test.rb", "test/condition_tests/equals_test.rb", "test/condition_tests/greater_than_or_equal_to_test.rb", "test/condition_tests/greater_than_test.rb", "test/condition_tests/inclusive_descendant_of_test.rb", "test/condition_tests/keywords_test.rb", "test/condition_tests/less_than_or_equal_to_test.rb", "test/condition_tests/less_than_test.rb", "test/condition_tests/like_test.rb", "test/condition_tests/nil_test.rb", "test/condition_tests/not_begin_with_test.rb", "test/condition_tests/not_blank_test.rb", "test/condition_tests/not_end_with_test.rb", "test/condition_tests/not_equal_test.rb", "test/condition_tests/not_have_keywords_test.rb", "test/condition_tests/not_like_test.rb", "test/condition_tests/not_nil_test.rb", "test/condition_tests/sibling_of_test.rb", "test/conditions_tests/any_or_all_test.rb", "test/conditions_tests/base_test.rb", "test/conditions_tests/groups_test.rb", "test/conditions_tests/magic_methods_test.rb", "test/conditions_tests/multiparameter_attributes_test.rb", "test/conditions_tests/protection_test.rb", "test/config_test.rb", "test/fixtures/accounts.yml", "test/fixtures/animals.yml", "test/fixtures/orders.yml", "test/fixtures/user_groups.yml", "test/fixtures/users.yml", "test/libs/awesome_nested_set/compatability.rb", "test/libs/awesome_nested_set/helper.rb", "test/libs/awesome_nested_set/named_scope.rb", "test/libs/awesome_nested_set.rb", "test/libs/rexml_fix.rb", "test/modifier_tests/day_of_month_test.rb", "test/search_tests/base_test.rb", "test/search_tests/conditions_test.rb", "test/search_tests/ordering_test.rb", "test/search_tests/pagination_test.rb", "test/search_tests/protection_test.rb", "test/test_helper.rb", "TODO.rdoc", "searchlogic.gemspec"]
|
14
|
+
s.has_rdoc = true
|
15
|
+
s.homepage = %q{http://github.com/binarylogic/searchlogic}
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Searchlogic", "--main", "README.rdoc"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{spree-searchlogic}
|
19
|
+
s.rubygems_version = %q{1.3.1}
|
20
|
+
s.summary = %q{Object based ActiveRecord searching, ordering, pagination, and more!}
|
21
|
+
s.test_files = ["test/active_record_tests/associations_test.rb", "test/active_record_tests/base_test.rb", "test/condition_tests/base_test.rb", "test/condition_tests/begins_with_test.rb", "test/condition_tests/blank_test.rb", "test/condition_tests/child_of_test.rb", "test/condition_tests/descendant_of_test.rb", "test/condition_tests/ends_with_test.rb", "test/condition_tests/equals_test.rb", "test/condition_tests/greater_than_or_equal_to_test.rb", "test/condition_tests/greater_than_test.rb", "test/condition_tests/inclusive_descendant_of_test.rb", "test/condition_tests/keywords_test.rb", "test/condition_tests/less_than_or_equal_to_test.rb", "test/condition_tests/less_than_test.rb", "test/condition_tests/like_test.rb", "test/condition_tests/nil_test.rb", "test/condition_tests/not_begin_with_test.rb", "test/condition_tests/not_blank_test.rb", "test/condition_tests/not_end_with_test.rb", "test/condition_tests/not_equal_test.rb", "test/condition_tests/not_have_keywords_test.rb", "test/condition_tests/not_like_test.rb", "test/condition_tests/not_nil_test.rb", "test/condition_tests/sibling_of_test.rb", "test/conditions_tests/any_or_all_test.rb", "test/conditions_tests/base_test.rb", "test/conditions_tests/groups_test.rb", "test/conditions_tests/magic_methods_test.rb", "test/conditions_tests/multiparameter_attributes_test.rb", "test/conditions_tests/protection_test.rb", "test/config_test.rb", "test/modifier_tests/day_of_month_test.rb", "test/search_tests/base_test.rb", "test/search_tests/conditions_test.rb", "test/search_tests/ordering_test.rb", "test/search_tests/pagination_test.rb", "test/search_tests/protection_test.rb", "test/test_helper.rb"]
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 2
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_runtime_dependency(%q<activerecord>, [">= 0"])
|
29
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
30
|
+
s.add_runtime_dependency(%q<echoe>, [">= 0"])
|
31
|
+
else
|
32
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
33
|
+
s.add_dependency(%q<activesupport>, [">= 0"])
|
34
|
+
s.add_dependency(%q<echoe>, [">= 0"])
|
35
|
+
end
|
36
|
+
else
|
37
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
38
|
+
s.add_dependency(%q<activesupport>, [">= 0"])
|
39
|
+
s.add_dependency(%q<echoe>, [">= 0"])
|
40
|
+
end
|
41
|
+
end
|