birddog 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,24 +1,18 @@
1
1
  module Birddog
2
2
 
3
3
  class DateExpression
4
- attr_reader :value, :condition
4
+ attr_reader :value
5
5
 
6
6
  def initialize(value)
7
- # allow additional spaces to be entered between conditions and value
8
7
  value.gsub!(/\s/, '')
9
- parts = value.scan(/(?:[=<>]+|(?:[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}))/)[0,2]
8
+ parts = value.scan(/(?:[=<>]+|(?:[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}))/)[0,2]
10
9
  @value = Date.parse(Chronic.parse(parts.last).to_s)
11
- @condition = sanitize_condition(parts.first)
12
- end
13
-
14
- def sanitize_condition(cond)
15
- valid = %w(= == > < <= >= <>)
16
- valid.include?(cond) ? cond.strip : "="
17
10
  end
18
11
 
19
12
  def to_s
20
13
  @value.to_s
21
14
  end
15
+
22
16
  end
23
17
 
24
18
  end
@@ -28,16 +28,16 @@ module Birddog
28
28
  [ "#{field_to_search} #{search_con} ", value_to_search ]
29
29
  end
30
30
 
31
- def conditions_for_date(field, value)
32
- [ "#{field[:attribute]} #{value.condition} ? ", value.value.strftime("%Y-%m-%d")]
31
+ def conditions_for_date(field, condition, value)
32
+ [ "#{field[:attribute]} #{condition} ? ", value.value.strftime("%Y-%m-%d")]
33
33
  end
34
34
 
35
- def conditions_for_numeric(field, value)
36
- case value.condition
35
+ def conditions_for_numeric(field, condition, value)
36
+ case condition
37
37
  when "=" then
38
38
  [ "ABS(#{field[:attribute]}) >= ? AND ABS(#{field[:attribute]}) < ?", value.to_f.abs.floor, (value.to_f.abs + 1).floor ]
39
39
  else
40
- [ "#{field[:attribute]} #{value.condition} ? ", value.to_f ]
40
+ [ "#{field[:attribute]} #{condition} ? ", value.to_f ]
41
41
  end
42
42
  end
43
43
 
@@ -2,21 +2,12 @@ module Birddog
2
2
 
3
3
  class NumericExpression
4
4
 
5
- attr_reader :condition
6
-
7
5
  def initialize(value, type)
8
- # allow additional spaces to be entered between conditions and value
9
6
  value.gsub!(/\s/, '')
10
7
  parts = value.scan(/(?:[=<>]+|(?:-?\d|\.)+)/)[0,2]
11
8
 
12
9
  @value = Float(parts.last)
13
10
  @value = @value.to_i if type == :integer
14
- @condition = sanitize_condition(parts.first)
15
- end
16
-
17
- def sanitize_condition(cond)
18
- valid = %w(= == > < <= >= <>)
19
- valid.include?(cond) ? cond.strip : "="
20
11
  end
21
12
 
22
13
  def to_i
@@ -30,6 +21,7 @@ module Birddog
30
21
  def to_s
31
22
  @value.to_s
32
23
  end
24
+
33
25
  end
34
26
 
35
27
  end
@@ -1,3 +1,3 @@
1
1
  module Birddog
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/birddog.rb CHANGED
@@ -50,7 +50,7 @@ module Birddog
50
50
  :regex => options.fetch(:regex, false),
51
51
  :wildcard => options.fetch(:wildcard, false),
52
52
  :aggregate => options.fetch(:aggregate, false),
53
- :options => options.except(:attribute, :type, :case_sensitive, :match_substring, :regex, :wildcard, :aggregate),
53
+ :options => options.except(:attribute, :type, :case_sensitive, :match_substring, :regex, :wildcard, :aggregate, :cast),
54
54
  :mapping => mapping || lambda{ |v| v }
55
55
  }
56
56
 
@@ -126,7 +126,7 @@ module Birddog
126
126
 
127
127
 
128
128
  def callable_or_cast(field, value)
129
- if field[:cast] && cast_val.respond_to?(:call)
129
+ if field[:cast] && field[:cast].respond_to?(:call)
130
130
  field[:cast].call(value)
131
131
  else
132
132
  cast_value(value, field[:type])
@@ -150,7 +150,18 @@ module Birddog
150
150
  end
151
151
  private :cast_value
152
152
 
153
+ def parse_condition(value)
154
+ valid = %w(= == > < <= >= <>)
155
+ value.gsub!(/\s/, '')
156
+
157
+ parts = value.scan(/(?:[=<>]+)/)
158
+ cond = parts.first
159
+ valid.include?(cond) ? cond.strip : "="
160
+ end
161
+ private :parse_condition
162
+
153
163
  def setup_conditions(field, value)
164
+ condition = parse_condition(value)
154
165
  value = callable_or_cast(field, value)
155
166
  value = field[:mapping].call(value)
156
167
 
@@ -158,9 +169,9 @@ module Birddog
158
169
  when :string then
159
170
  conditions_for_string_search(field, value)
160
171
  when :float, :decimal, :integer then
161
- conditions_for_numeric(field, value)
172
+ conditions_for_numeric(field, condition, value)
162
173
  when :date, :datetime, :time then
163
- conditions_for_date(field, value)
174
+ conditions_for_date(field, condition, value)
164
175
  else
165
176
  { field[:attribute] => value }
166
177
  end
@@ -10,6 +10,14 @@ describe Birddog::Birddog do
10
10
  @bike = @john.products.create(:name => "Bike", :value => 100)
11
11
  end
12
12
 
13
+ describe "castable" do
14
+ it "casts Date when a cast function is provided" do
15
+ prods = Product.scopes_for_query("cast_val:10")
16
+
17
+ prods.must_include(@ducky)
18
+ end
19
+ end
20
+
13
21
  describe "aggregates" do
14
22
  it "doesn't include HAVING clause when no condition included" do
15
23
  sql = User.scopes_for_query("aggregate_user").scopes_for_query("total_product_value").to_sql
data/specs/spec_helper.rb CHANGED
@@ -65,6 +65,7 @@ class Product < ActiveRecord::Base
65
65
  search.text_search "products.name", "products.value"
66
66
 
67
67
  search.field :name, :regex => true, :wildcard => true
68
+ search.field :cast_val, :type => :decimal, :cast => lambda { |v| 10 }, :attribute => :value
68
69
  search.field :value, :type => :decimal
69
70
  search.field :available, :type => :boolean
70
71
 
data/specs/test.db CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: birddog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-02-01 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
16
- requirement: &10161580 !ruby/object:Gem::Requirement
16
+ requirement: &22249780 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *10161580
24
+ version_requirements: *22249780
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &10161080 !ruby/object:Gem::Requirement
27
+ requirement: &22249280 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *10161080
35
+ version_requirements: *22249280
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: sqlite3-ruby
38
- requirement: &10160540 !ruby/object:Gem::Requirement
38
+ requirement: &22248740 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *10160540
46
+ version_requirements: *22248740
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: chronic
49
- requirement: &10150460 !ruby/object:Gem::Requirement
49
+ requirement: &22238660 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *10150460
57
+ version_requirements: *22238660
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: activerecord
60
- requirement: &10149940 !ruby/object:Gem::Requirement
60
+ requirement: &22238140 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *10149940
68
+ version_requirements: *22238140
69
69
  description: Seeeeeeeee Readme
70
70
  email:
71
71
  - brandonsdewitt@gmail.com
@@ -105,7 +105,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
105
105
  version: '0'
106
106
  segments:
107
107
  - 0
108
- hash: 2978035359528614975
108
+ hash: -2231863976579242335
109
109
  required_rubygems_version: !ruby/object:Gem::Requirement
110
110
  none: false
111
111
  requirements:
@@ -114,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
114
  version: '0'
115
115
  segments:
116
116
  - 0
117
- hash: 2978035359528614975
117
+ hash: -2231863976579242335
118
118
  requirements: []
119
119
  rubyforge_project: birddog
120
120
  rubygems_version: 1.8.10