CloudSesame 0.7.4 → 0.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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