CloudSesame 0.7.4 → 0.7.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,6 +8,8 @@ module CloudSesame
8
8
 
9
9
  RANGE_FORMAT = Regexp.new(/\A(\[|{)(.*),(.*)(\}|\])\z/).freeze
10
10
  DIGIT_FORMAT = Regexp.new(/\A\d+(.\d+)?\z/).freeze
11
+ DATETIME_FORMAT = Regexp.new(/\d+{4}-\d+{2}-\d+{2}T\d+{2}:\d+{2}:\d+{2}/).freeze
12
+ DATE_FORMAT = Regexp.new(/\d+{4}-\d+{2}-\d+{2}/).freeze
11
13
 
12
14
  attr_reader :value, :changed, :compiled
13
15
 
@@ -31,6 +33,14 @@ module CloudSesame
31
33
  value.kind_of?(Date) || value.kind_of?(Time)
32
34
  end
33
35
 
36
+ def self.string_datetime?(value)
37
+ value.is_a?(String) && DATETIME_FORMAT =~ value
38
+ end
39
+
40
+ def self.string_date?(value)
41
+ value.is_a?(String) && DATE_FORMAT =~ value
42
+ end
43
+
34
44
  def initialize(value, type = nil)
35
45
  self.value = value
36
46
  @type = type
@@ -3,10 +3,20 @@ module CloudSesame
3
3
  module AST
4
4
  class DateValue < StringValue
5
5
 
6
- FORMAT = '%FT%TZ'.freeze
6
+ COMPILE_FORMAT = '%FT%TZ'.freeze
7
+ DATETIME_FORMAT = '%FT%T'.freeze
8
+ DATE_FORMAT = '%F'.freeze
7
9
 
8
10
  def self.parse(value)
9
- range?(value) || string_range?(value) ? RangeValue.new(value, self) : new(value)
11
+ if value.kind_of?(RangeValue)
12
+ value.type = self
13
+ return value
14
+ end
15
+
16
+ range?(value) || string_range?(value) ? RangeValue.new(value, self) :
17
+ string_datetime?(value) ? new(parse_datetime(value)) :
18
+ string_date?(value) ? new(parse_date(value)) :
19
+ new(value)
10
20
  end
11
21
 
12
22
  def to_s
@@ -15,12 +25,20 @@ module CloudSesame
15
25
 
16
26
  private
17
27
 
28
+ def self.parse_datetime(string)
29
+ DateTime.strptime(string, DATETIME_FORMAT)
30
+ end
31
+
32
+ def self.parse_date(string)
33
+ Date.strptime(string, DATE_FORMAT)
34
+ end
35
+
18
36
  def recompile(value)
19
37
  super strip format value
20
38
  end
21
39
 
22
40
  def format(value)
23
- value.strftime FORMAT
41
+ value.strftime COMPILE_FORMAT
24
42
  end
25
43
 
26
44
  end
@@ -6,7 +6,7 @@ module CloudSesame
6
6
  TYPES = {
7
7
  string: StringValue,
8
8
  numeric: NumericValue,
9
- date: DateValue
9
+ datetime: DateValue
10
10
  }
11
11
 
12
12
  def self.map_type(symbol)
@@ -0,0 +1,49 @@
1
+ module CloudSesame
2
+ module Query
3
+ module AST
4
+ describe DateValue do
5
+
6
+ subject { DateValue.parse(value) }
7
+
8
+ describe '.parse' do
9
+ context 'when value is a date or datetime object' do
10
+ let(:value) { DateTime.now }
11
+ it 'should return an DateValue object' do
12
+ expect(subject).to be_kind_of(DateValue)
13
+ expect(subject.value).to be_kind_of(Date)
14
+ end
15
+ end
16
+ context 'when value is a datetime in string format' do
17
+ let(:value) { "2016-03-09T13:50:41+00:00" }
18
+ it 'should return an DateValue object' do
19
+ expect(subject).to be_kind_of(DateValue)
20
+ expect(subject.value).to be_kind_of(Date)
21
+ end
22
+ end
23
+ context 'when value is a date in string format' do
24
+ let(:value) { "2016-03-09" }
25
+ it 'should return an DateValue object' do
26
+ expect(subject).to be_kind_of(DateValue)
27
+ expect(subject.value).to be_kind_of(Date)
28
+ end
29
+ end
30
+ context 'when value is a RangeValue object' do
31
+ let(:value) { RangeValue.new.gt(Date.today).lt(Date.today + 3) }
32
+ it 'should return an RangeValue object contains DateValue inside' do
33
+ expect(subject).to be_kind_of(RangeValue)
34
+ expect(subject.value[1, 2]).to include(DateValue)
35
+ end
36
+ end
37
+ context 'when value is a range object' do
38
+ let(:value) { "[2016-03-09T13:50:41+00:00,2016-03-10]" }
39
+ it 'should return an RangeValue object contains DateValue inside' do
40
+ expect(subject).to be_kind_of(RangeValue)
41
+ expect(subject.value[1, 2]).to include(DateValue)
42
+ end
43
+ end
44
+ end
45
+
46
+ end
47
+ end
48
+ end
49
+ end
@@ -109,7 +109,7 @@ fdescribe CloudSesame do
109
109
 
110
110
  @tags = [1, 2]
111
111
  q = nil
112
- profile 10_000 do
112
+ profile 1 do
113
113
  q = Product.cloudsearch
114
114
  .query("black leather jacket")
115
115
  .sort(price: :asc, created_at: :desc)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: CloudSesame
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.4
4
+ version: 0.7.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Chu
@@ -230,6 +230,7 @@ files:
230
230
  - spec/cloud_sesame/query/ast/abstract/single_expression_operator_spec.rb
231
231
  - spec/cloud_sesame/query/ast/abstract/value_spec.rb
232
232
  - spec/cloud_sesame/query/ast/and_spec.rb
233
+ - spec/cloud_sesame/query/ast/date_value_spec.rb
233
234
  - spec/cloud_sesame/query/ast/numeric_value_spec.rb
234
235
  - spec/cloud_sesame/query/ast/or_spec.rb
235
236
  - spec/cloud_sesame/query/ast/range_value_spec.rb
@@ -293,6 +294,7 @@ test_files:
293
294
  - spec/cloud_sesame/query/ast/abstract/single_expression_operator_spec.rb
294
295
  - spec/cloud_sesame/query/ast/abstract/value_spec.rb
295
296
  - spec/cloud_sesame/query/ast/and_spec.rb
297
+ - spec/cloud_sesame/query/ast/date_value_spec.rb
296
298
  - spec/cloud_sesame/query/ast/numeric_value_spec.rb
297
299
  - spec/cloud_sesame/query/ast/or_spec.rb
298
300
  - spec/cloud_sesame/query/ast/range_value_spec.rb