CloudSesame 0.2.5 → 0.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3459d29078ee48b4320364769b91bbe66f7fbece
4
- data.tar.gz: e77c9b2917e402329afa7206512d51f77fe973aa
3
+ metadata.gz: c1ab042a61e9108d439ecddd4bdf5a2b5548aa8f
4
+ data.tar.gz: 8b3015719e50ade4f074fb471cac15cc8abe11f3
5
5
  SHA512:
6
- metadata.gz: 3d8586b977026307c6ef5027cf98f76c9fea091d75e99bfad83a67d446f53b8b469b92c56537b38e6eec0ca8fd81f8c07ab644c668fcc45e83159f6bdcf6b653
7
- data.tar.gz: 9f66a716cf04f1713dca9a59fd6ef633c5d71432661d78af41110e164d51527721d1bb09d63bd464a25c00116e2308de9647a644c301e1fb22ba502b5b10caea
6
+ metadata.gz: 32f17eacc19c2ddb90270fe09f5e2c7c8eb0174633f269dba9fc38d1bad259362a86000b40a845cc26d4cea2b768ebafba015c66c6d83361009b308b6c5bb272
7
+ data.tar.gz: 2d496df6ccdc7fd728aadd58ad6fc1233d98ace2a4924026462bd7f8372116f046cbccce2137b6ac139022b829301f3534945997624f0e1b016394881cf193b6
data/Gemfile.lock CHANGED
@@ -1,18 +1,18 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- CloudSesame (0.2.5)
4
+ CloudSesame (0.3.0)
5
5
  aws-sdk (~> 2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- aws-sdk (2.2.10)
11
- aws-sdk-resources (= 2.2.10)
12
- aws-sdk-core (2.2.10)
10
+ aws-sdk (2.2.12)
11
+ aws-sdk-resources (= 2.2.12)
12
+ aws-sdk-core (2.2.12)
13
13
  jmespath (~> 1.0)
14
- aws-sdk-resources (2.2.10)
15
- aws-sdk-core (= 2.2.10)
14
+ aws-sdk-resources (2.2.12)
15
+ aws-sdk-core (= 2.2.12)
16
16
  coderay (1.1.0)
17
17
  diff-lcs (1.2.5)
18
18
  ffi (1.9.10)
@@ -61,6 +61,7 @@ GEM
61
61
  diff-lcs (>= 1.2.0, < 2.0)
62
62
  rspec-support (~> 3.4.0)
63
63
  rspec-support (3.4.1)
64
+ ruby-prof (0.15.9)
64
65
  shellany (0.0.1)
65
66
  slop (3.6.0)
66
67
  thor (0.19.1)
@@ -74,3 +75,4 @@ DEPENDENCIES
74
75
  guard-rspec
75
76
  pry (~> 0)
76
77
  rspec (~> 3)
78
+ ruby-prof
data/cloud_sesame.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'CloudSesame'
3
- s.version = '0.2.5'
4
- s.date = '2016-01-14'
3
+ s.version = '0.3.0'
4
+ s.date = '2016-01-20'
5
5
  s.summary = "AWS CloudSearch Query DSL"
6
6
  s.description = "AWS CloudSearch Query DSL"
7
7
  s.authors = ['Scott Chu', 'Emily Fan', 'Greg Ward', 'David McHoull',
@@ -22,4 +22,5 @@ Gem::Specification.new do |s|
22
22
  s.add_development_dependency 'pry', '~> 0'
23
23
  s.add_development_dependency 'guard'
24
24
  s.add_development_dependency 'guard-rspec'
25
+ s.add_development_dependency 'ruby-prof'
25
26
  end
@@ -29,10 +29,10 @@ module CloudSesame
29
29
  end
30
30
 
31
31
  def field(name, options = {})
32
- field_name = options[:as] || name
32
+ field_name = (options[:as] || name).to_sym
33
33
  define_query_options(field_name, options.delete(:query)) if options[:query]
34
34
  define_facet_options(field_name, options.delete(:facet)) if options[:facet]
35
- define_filter_query_field(name, options)
35
+ define_filter_query_field(name.to_sym, options)
36
36
  end
37
37
 
38
38
  def define_sloppiness(value)
@@ -63,15 +63,22 @@ module CloudSesame
63
63
  if (as = options[:as]) && (existing_options = context[:filter_query, true][:fields, true].delete(as))
64
64
  options.merge!(existing_options)
65
65
  end
66
- context[:filter_query, true][:fields, true][name.to_sym] = options
66
+ if (block = options[:default])
67
+ filter_query_defaults << Query::AST::Literal.new(name, nil, options, &block)
68
+ end
69
+ context[:filter_query, true][:fields, true][name] = options
67
70
  end
68
71
 
69
72
  def define_query_options(name, options)
70
- context[:query_options, true][:fields, true][name.to_sym] = format_options(options)
73
+ context[:query_options, true][:fields, true][name] = format_options(options)
71
74
  end
72
75
 
73
76
  def define_facet_options(name, options)
74
- context[:facet, true][name.to_sym] = format_options(options)
77
+ context[:facet, true][name] = format_options(options)
78
+ end
79
+
80
+ def filter_query_defaults
81
+ context[:filter_query, true][:defaults] ||= []
75
82
  end
76
83
 
77
84
  end
@@ -3,12 +3,18 @@ module CloudSesame
3
3
  module AST
4
4
  class Literal
5
5
 
6
+ SINGLE_QUATE = /\'/
7
+ ESCAPE_QUATE = "\\'"
8
+
6
9
  attr_accessor :field
7
10
  attr_reader :options, :value
8
11
 
9
12
  def initialize(field = nil, value = nil, options = {}, &block)
10
13
  @field = field
11
- @value = valufy value
14
+
15
+ @value = Value.parse value if value
16
+ @value = Value.parse ValueEvaluator.new.instance_exec &block if block_given?
17
+
12
18
  @options = options || {}
13
19
  (@options[:included] ||= []) << @value
14
20
  end
@@ -24,20 +30,22 @@ module CloudSesame
24
30
  end
25
31
 
26
32
  def as_field
27
- options[:as] || field
33
+ @as_field ||= (options[:as] || field).to_s
28
34
  end
29
35
 
30
36
  def compile(detailed = false)
31
- detailed ? detailed_format : standard_format
37
+ updated? ? recompile(detailed) : @compiled
32
38
  end
33
39
 
34
40
  private
35
41
 
36
- def valufy(value)
37
- return value if value.kind_of? Value
38
- return RangeValue.new value if value.kind_of? Range
39
- return DateValue.new(value) if value.kind_of?(Date) || value.kind_of?(Time)
40
- Value.new value
42
+ def updated?
43
+ @compiled_value != value
44
+ end
45
+
46
+ def recompile(detailed)
47
+ @compiled_value = value
48
+ @compiled = detailed ? detailed_format : standard_format
41
49
  end
42
50
 
43
51
  def standard_format
@@ -48,8 +56,12 @@ module CloudSesame
48
56
  "field=#{ escape as_field } #{ value.compile }"
49
57
  end
50
58
 
51
- def escape(data = "")
52
- "'#{ data.to_s.gsub(/\'/) { "\\'" } }'"
59
+ def escape(data)
60
+ "'#{ data.gsub(SINGLE_QUATE) { ESCAPE_QUATE } }'"
61
+ end
62
+
63
+ class ValueEvaluator
64
+ include DSL::RangeMethods
53
65
  end
54
66
 
55
67
  end
@@ -15,7 +15,7 @@ module CloudSesame
15
15
  end
16
16
 
17
17
  def compile
18
- "(#{ self.class::SYMBOL }#{ boost } #{ children.compile })" unless children.empty?
18
+ "(#{ symbol }#{ boost } #{ children.compile })" unless children.empty?
19
19
  end
20
20
 
21
21
  def <<(object)
@@ -6,7 +6,7 @@ module CloudSesame
6
6
  SYMBOL = :near
7
7
 
8
8
  def compile
9
- "(#{ SYMBOL }#{ boost }#{ distance } #{ child.compile DETAILED })" if child
9
+ "(#{ symbol }#{ boost }#{ distance } #{ child.compile detailed })" if child
10
10
  end
11
11
 
12
12
  def distance
@@ -10,7 +10,7 @@ module CloudSesame
10
10
  end
11
11
 
12
12
  def compile(detailed = nil)
13
- "(#{ self.class::SYMBOL }#{ boost } #{ child.compile })" if child
13
+ "(#{ symbol }#{ boost } #{ child.compile })" if child
14
14
  end
15
15
 
16
16
  end
@@ -0,0 +1,13 @@
1
+ module CloudSesame
2
+ module Query
3
+ module AST
4
+ class NumericValue < Value
5
+
6
+ def compile
7
+ data
8
+ end
9
+
10
+ end
11
+ end
12
+ end
13
+ end
@@ -16,6 +16,10 @@ module CloudSesame
16
16
  " boost=#{ options[:boost] }" if options[:boost]
17
17
  end
18
18
 
19
+ def symbol
20
+ self.class::SYMBOL
21
+ end
22
+
19
23
  end
20
24
  end
21
25
  end
@@ -3,7 +3,7 @@ module CloudSesame
3
3
  module AST
4
4
  class Phrase < SingleExpressionOperator
5
5
  DETAILED = true
6
- SYMBOL = :prefix
6
+ SYMBOL = :phrase
7
7
  end
8
8
  end
9
9
  end
@@ -3,48 +3,70 @@ module CloudSesame
3
3
  module AST
4
4
  class RangeValue < Value
5
5
 
6
- def initialize(range = nil)
7
- @data = range.kind_of?(Range) ? [true, valufy(range.begin), valufy(range.end), !range.exclude_end?] : [false, nil, nil, false]
6
+ STRING_FORMAT = /\A(\[|{)(.*),(.*)(\}|\])\z/
7
+
8
+ def initialize(value = nil)
9
+ @data = if value.kind_of?(Range)
10
+ range_to_array(value)
11
+ elsif value.is_a?(String) && (match = STRING_FORMAT.match value)
12
+ @data = match.captures
13
+ else
14
+ default_range
15
+ end
8
16
  end
9
17
 
10
18
  def compile
11
- "#{ lb }#{ data[1].to_s },#{ data[2].to_s }#{ ub }"
19
+ "#{ lb }#{ l.to_s },#{ u.to_s }#{ ub }"
12
20
  end
13
21
 
14
22
  def gt(value = nil)
15
- data[0], data[1] = false, valufy(value) if value
23
+ data[0], data[1] = '{', Value.parse(value) if value
16
24
  return self
17
25
  end
18
26
 
19
27
  def gte(value = nil)
20
- data[0], data[1] = true, valufy(value) if value
28
+ data[0], data[1] = '[', Value.parse(value) if value
21
29
  return self
22
30
  end
23
31
 
24
32
  def lt(value = nil)
25
- data[2], data[3] = valufy(value), false if value
33
+ data[2], data[3] = Value.parse(value), '}' if value
26
34
  return self
27
35
  end
28
36
 
29
37
  def lte(value = nil)
30
- data[2], data[3] = valufy(value), true if value
38
+ data[2], data[3] = Value.parse(value), ']' if value
31
39
  return self
32
40
  end
33
41
 
42
+ def l
43
+ data[1]
44
+ end
45
+
46
+ def u
47
+ data[2]
48
+ end
49
+
34
50
  private
35
51
 
36
- def valufy(value)
37
- return value if value.kind_of? Value
38
- return DateValue.new(value) if value.kind_of?(Date) || value.kind_of?(Time)
39
- Value.new value
52
+ def range_to_array(r)
53
+ ['[', r.begin, r.end, end_symbol(r)]
54
+ end
55
+
56
+ def end_symbol(value)
57
+ value.exclude_end? ? '}' : ']'
58
+ end
59
+
60
+ def default_range
61
+ ['{', nil, nil, '}']
40
62
  end
41
63
 
42
64
  def lb
43
- data[1] && data[0] ? '[' : '{'
65
+ data[1] ? data[0] : '{'
44
66
  end
45
67
 
46
68
  def ub
47
- data[2] && data[3] ? ']' : '}'
69
+ data[2] ? data[3] : '}'
48
70
  end
49
71
 
50
72
  end
@@ -12,6 +12,14 @@ module CloudSesame
12
12
  children.size > 1
13
13
  end
14
14
 
15
+ private
16
+
17
+ def create_children
18
+ array = FieldArray.new(context[:defaults] || [])
19
+ array.dsl_scope = dsl_scope
20
+ array
21
+ end
22
+
15
23
  end
16
24
  end
17
25
  end
@@ -22,7 +22,11 @@ module CloudSesame
22
22
  end
23
23
 
24
24
  def compile
25
- "(#{ self.class::SYMBOL }#{ boost } #{ child.compile self.class::DETAILED })" if child
25
+ "(#{ symbol }#{ boost } #{ child.compile detailed })" if child
26
+ end
27
+
28
+ def detailed
29
+ self.class::DETAILED
26
30
  end
27
31
 
28
32
  end
@@ -3,14 +3,28 @@ module CloudSesame
3
3
  module AST
4
4
  class Value
5
5
 
6
+ RANGE_FORMAT = /\A[\[\{].*[\]\}]\z/
7
+ DIGIT_FORMAT = /\A\d+(.\d+)?\z/
8
+ SINGLE_QUATE = /\'/
9
+ ESCAPE_QUATE = "\\'"
10
+
6
11
  attr_reader :data
7
12
 
13
+ def self.parse(value)
14
+ return value if value.kind_of? AST::Value
15
+ return AST::DateValue.new(value) if value.kind_of?(Date) || value.kind_of?(Time)
16
+ return AST::RangeValue.new(value) if value.kind_of?(Range) || (value.is_a?(String) && RANGE_FORMAT =~ value)
17
+ return AST::NumericValue.new(value) if value.is_a?(Numeric) || (value.is_a?(String) && DIGIT_FORMAT =~ value)
18
+ AST::Value.new(value)
19
+ end
20
+
8
21
  def initialize(data)
9
22
  @data = data
23
+ @compiled = compile
10
24
  end
11
25
 
12
26
  def compile
13
- format data
27
+ updated? ? recompile : @compiled
14
28
  end
15
29
 
16
30
  def to_s
@@ -23,24 +37,21 @@ module CloudSesame
23
37
 
24
38
  private
25
39
 
26
- def format(data)
27
- range?(data) || digits?(data) ? data : escape(data)
28
- end
29
-
30
- def range?(data)
31
- data =~ /^[\[\{].*[\]\}]$/
40
+ def updated?
41
+ @compiled_data != @data
32
42
  end
33
43
 
34
- def digits?(data)
35
- data.to_s =~ /^\d+(.\d+)?$/
44
+ def recompile
45
+ @compiled_data = @data
46
+ @compiled = escape @compiled_data
36
47
  end
37
48
 
38
49
  def escape(data = "")
39
- "'#{ data.to_s.gsub(/\'/) { "\\'" } }'"
50
+ "'#{ data.gsub(SINGLE_QUATE) { ESCAPE_QUATE } }'"
40
51
  end
41
52
 
42
53
  def strip(string)
43
- string.gsub(/ /, '')
54
+ string.tr(" ", "")
44
55
  end
45
56
 
46
57
  end
@@ -3,18 +3,22 @@ module CloudSesame
3
3
  module DSL
4
4
  module FieldMethods
5
5
 
6
- private
7
-
8
- def method_missing(field, *values, &block)
9
- if (fields = dsl_context[:fields]) && fields[field]
10
- dsl_scope.children.field = field
6
+ def literal(name, *values)
7
+ if (fields = dsl_context[:fields]) && fields[name]
8
+ dsl_scope.children.field = name
11
9
  dsl_scope.children.dsl_return = dsl_return
12
10
  dsl_scope.children.insert values
13
11
  else
14
- super
12
+ false
15
13
  end
16
14
  end
17
15
 
16
+ private
17
+
18
+ def method_missing(name, *values, &block)
19
+ (result = literal(name, *values)) ? result : super
20
+ end
21
+
18
22
  end
19
23
  end
20
24
  end
@@ -5,18 +5,18 @@ module CloudSesame
5
5
 
6
6
  # CLAUSE: PAGE and SIZE
7
7
  # =========================================
8
- def page(input = nil)
9
- if input
8
+ def page(input = false)
9
+ if input || input.nil?
10
10
  request.page.start = nil
11
- request.page.page = input.to_i
11
+ request.page.page = (input || 1).to_i
12
12
  return self
13
13
  else
14
14
  request.page.page
15
15
  end
16
16
  end
17
17
 
18
- def start(input = nil)
19
- if input
18
+ def start(input = false)
19
+ if input || input.nil?
20
20
  request.page.page = nil
21
21
  request.page.start = input.to_i
22
22
  return self
@@ -25,10 +25,14 @@ module CloudSesame
25
25
  end
26
26
  end
27
27
 
28
- def size(input)
28
+ alias_method :offset, :start
29
+
30
+ def size(input = false)
29
31
  if input
30
32
  request.page.size = input.to_i
31
33
  return self
34
+ elsif input.nil?
35
+ return self
32
36
  else
33
37
  request.page.size
34
38
  end
@@ -8,20 +8,7 @@ module CloudSesame
8
8
  end
9
9
 
10
10
  def root
11
- @root ||= create_root_with_default_values
12
- end
13
-
14
- private
15
-
16
- def create_root_with_default_values
17
- root = CloudSesame::Query::AST::Root.new context
18
- context[:fields].each do |field, options|
19
- if options && (block = options[:default])
20
- value = root.instance_exec &block
21
- root << AST::Literal.new(field, value, options)
22
- end
23
- end if context[:fields]
24
- root
11
+ @root ||= CloudSesame::Query::AST::Root.new context
25
12
  end
26
13
 
27
14
  end
data/lib/cloud_sesame.rb CHANGED
@@ -17,19 +17,18 @@ require 'cloud_sesame/query/error/missing_query'
17
17
  # Query DSL Methods
18
18
  # ===============================================
19
19
  require 'cloud_sesame/query/dsl/base'
20
- require 'cloud_sesame/query/dsl/query_methods'
21
- require 'cloud_sesame/query/dsl/page_methods'
22
- require 'cloud_sesame/query/dsl/sort_methods'
23
- require 'cloud_sesame/query/dsl/return_methods'
24
-
25
20
  require 'cloud_sesame/query/dsl/block_methods'
26
21
  require 'cloud_sesame/query/dsl/block_chaining_methods'
27
- require 'cloud_sesame/query/dsl/field_methods'
28
22
  require 'cloud_sesame/query/dsl/field_array_methods'
23
+ require 'cloud_sesame/query/dsl/field_methods'
29
24
  require 'cloud_sesame/query/dsl/filter_query_methods'
30
25
  require 'cloud_sesame/query/dsl/operator_methods'
26
+ require 'cloud_sesame/query/dsl/page_methods'
27
+ require 'cloud_sesame/query/dsl/query_methods'
31
28
  require 'cloud_sesame/query/dsl/range_methods'
29
+ require 'cloud_sesame/query/dsl/return_methods'
32
30
  require 'cloud_sesame/query/dsl/scope_methods'
31
+ require 'cloud_sesame/query/dsl/sort_methods'
33
32
 
34
33
  # Query Query Filter Query AST Tree
35
34
  # ===============================================
@@ -48,6 +47,7 @@ require 'cloud_sesame/query/ast/term'
48
47
  require 'cloud_sesame/query/ast/literal'
49
48
  require 'cloud_sesame/query/ast/value'
50
49
  require 'cloud_sesame/query/ast/date_value'
50
+ require 'cloud_sesame/query/ast/numeric_Value'
51
51
  require 'cloud_sesame/query/ast/range_value'
52
52
  require 'cloud_sesame/query/ast/root'
53
53
 
data/profiler.rb ADDED
@@ -0,0 +1,91 @@
1
+ require 'profile'
2
+ require 'yaml'
3
+ require_relative './cloud_sesame.rb'
4
+
5
+ # AWS initializer
6
+ # =======================================================
7
+
8
+ YAML.load_file('aws.yml').each do |key, value|
9
+ ENV["AWS_#{ key }"] = value
10
+ end
11
+
12
+ # Domain Initializer /config/initializers/cloudsearch.rb
13
+ # =======================================================
14
+
15
+
16
+ CloudSesame::Domain::Client.configure do |config|
17
+ config.access_key = ENV['AWS_ACCESS_KEY_ID']
18
+ config.secret_key = ENV['AWS_SECRET_ACCESS_KEY']
19
+ end
20
+
21
+ # Usage Example
22
+ # =======================================================
23
+ class Product
24
+ include CloudSesame
25
+
26
+ define_cloudsearch do
27
+ # Product CloudSesame Config
28
+ config.endpoint = ENV['AWS_ENDPOINT']
29
+ config.region = ENV['AWS_REGION']
30
+
31
+ default_size 100
32
+
33
+ define_sloppiness 3
34
+
35
+ define_fuzziness do
36
+ max_fuzziness 3
37
+ min_char_size 6
38
+ fuzzy_percent 0.17
39
+ end
40
+
41
+ field :searchable_text, query: { weight: 2 }
42
+ field :description, query: true
43
+ field :tags
44
+
45
+ field :affiliate_advertiser_ext_id, facet: { size: 50 }
46
+ field :currency, facet: true
47
+ field :discount_percentage, facet: { buckets: %w([10,100] [25,100] [50,100] [70,100]), method: 'interval' }
48
+ field :manufacturer_name, facet: { size: 50 }
49
+ field :price, facet: { buckets: %w([0,25] [25,50] [50,100] [100,200] [200,}), method: 'interval' }
50
+ field :category_string, facet: { sort: 'bucket', size: 10_000 }
51
+ field :created_at, default: -> { gt Date.today }
52
+
53
+ scope :shoes_by_brand, ->(brand = nil) { query("shoes").and { manufacturer_name brand } if brand }
54
+ scope :and_mens do
55
+ and! { tags "men"}
56
+ end
57
+
58
+ end
59
+
60
+ end
61
+
62
+ def query
63
+ query = Product.cloudsearch
64
+ .query("black jacket")
65
+ .sort(price: :asc)
66
+ .page(1)
67
+ .size(1000)
68
+ .or {
69
+ or! {
70
+ tags("men", "women")
71
+ }
72
+ tags.not start_with("automotive"), "home"
73
+ and! {
74
+ price gt(100).lt(500)
75
+ created_at gt(Date.today - 7)
76
+ currency "CAD", "USD"
77
+ }
78
+
79
+ }.or {
80
+ and! {
81
+ tags "outdoor"
82
+ price gt(200).lt(1000)
83
+ created_at gt(Date.today - 7)
84
+ currency "CAD", "USD"
85
+ }
86
+ }
87
+
88
+ query.compile
89
+ end
90
+
91
+ query
@@ -1,100 +1,105 @@
1
- require 'spec_helper'
2
-
3
- describe CloudSesame do
4
-
5
- # # AWS initializer
6
- # require 'yaml'
7
- # YAML.load_file('aws.yml').each do |key, value|
8
- # ENV["AWS_#{ key }"] = value
9
- # end
10
-
11
- # # Domain Initializer /config/initializers/cloudsearch.rb
12
- # require 'cloud_sesame'
13
-
14
- # CloudSesame::Domain::Client.configure do |config|
15
- # config.access_key = ENV['AWS_ACCESS_KEY_ID']
16
- # config.secret_key = ENV['AWS_SECRET_ACCESS_KEY']
17
- # end
18
-
19
- # # Usage Example
20
- # class Product
21
- # include CloudSesame
22
-
23
- # define_cloudsearch do
24
- # # Product CloudSesame Config
25
- # config.endpoint = ENV['AWS_ENDPOINT']
26
- # config.region = ENV['AWS_REGION']
27
-
28
- # default_size 100
29
-
30
- # define_sloppiness 3
31
-
32
- # define_fuzziness do
33
- # max_fuzziness 3
34
- # min_char_size 6
35
- # fuzzy_percent 0.17
36
- # end
37
-
38
- # field :searchable_text, query: { weight: 2 }
39
- # field :description, query: true
40
- # field :tags
41
-
42
- # field :affiliate_advertiser_ext_id, facet: { size: 50 }
43
- # field :currency, facet: true
44
- # field :discount_percentage, facet: { buckets: %w([10,100] [25,100] [50,100] [70,100]), method: 'interval' }
45
- # field :manufacturer_name, facet: { size: 50 }
46
- # field :price, facet: { buckets: %w([0,25] [25,50] [50,100] [100,200] [200,}), method: 'interval' }
47
- # field :category_string, facet: { sort: 'bucket', size: 10_000 }
48
- # field :created_at
49
-
50
- # scope :shoes_by_brand, ->(brand = nil) { query("shoes").and { manufacturer_name brand } if brand }
51
- # scope :and_mens do
52
- # and! { tags "men"}
53
- # end
54
-
55
- # end
56
-
57
- # end
58
-
59
- # class NewProduct < Product
60
- # load_definition_from Product
61
-
62
- # define_cloudsearch do
63
- # field :searchable_text, query: { weight: 4 }
64
- # field :name, as: :text1
65
- # end
66
- # end
67
-
68
- # # Example Query
69
- # require 'benchmark'
70
- # Benchmark.bm do |x|
71
- # x.report do
72
- # 1.times do |i|
73
- # query = Product.cloudsearch.query("black jacket").sort(price: :ast).page(1).size(1000).or {
74
- # or! {
75
- # tags("men", "women")
76
- # }
77
- # tags.not start_with("automotive"), "home"
78
- # and! {
79
- # price gt(100).lt(500)
80
- # created_at gt(Date.today - 7)
81
- # currency "CAD", "USD"
82
- # }
83
-
84
- # }.or {
85
- # and! {
86
- # tags "outdoor"
87
- # price gt(200).lt(1000)
88
- # created_at gt(Date.today - 7)
89
- # currency "CAD", "USD"
90
- # }
91
- # }
92
-
93
- # query.compile
94
- # end
95
- # end
96
- # end
97
-
98
-
99
-
100
- end
1
+ # require 'spec_helper'
2
+ # require 'ruby-prof'
3
+ # require 'benchmark'
4
+
5
+ # describe CloudSesame do
6
+
7
+ # # AWS initializer
8
+ # # =======================================================
9
+ # require 'yaml'
10
+ # YAML.load_file('aws.yml').each do |key, value|
11
+ # ENV["AWS_#{ key }"] = value
12
+ # end
13
+
14
+ # # Domain Initializer /config/initializers/cloudsearch.rb
15
+ # # =======================================================
16
+ # require 'cloud_sesame'
17
+
18
+ # CloudSesame::Domain::Client.configure do |config|
19
+ # config.access_key = ENV['AWS_ACCESS_KEY_ID']
20
+ # config.secret_key = ENV['AWS_SECRET_ACCESS_KEY']
21
+ # end
22
+
23
+ # # Usage Example
24
+ # # =======================================================
25
+ # class Product
26
+ # include CloudSesame
27
+
28
+ # define_cloudsearch do
29
+ # # Product CloudSesame Config
30
+ # config.endpoint = ENV['AWS_ENDPOINT']
31
+ # config.region = ENV['AWS_REGION']
32
+
33
+ # default_size 100
34
+
35
+ # define_sloppiness 3
36
+
37
+ # define_fuzziness do
38
+ # max_fuzziness 3
39
+ # min_char_size 6
40
+ # fuzzy_percent 0.17
41
+ # end
42
+
43
+ # field :searchable_text, query: { weight: 2 }
44
+ # field :description, query: true
45
+ # field :tags
46
+
47
+ # field :affiliate_advertiser_ext_id, facet: { size: 50 }
48
+ # field :currency, facet: true
49
+ # field :discount_percentage, facet: { buckets: %w([10,100] [25,100] [50,100] [70,100]), method: 'interval' }
50
+ # field :manufacturer_name, facet: { size: 50 }
51
+ # field :price, facet: { buckets: %w([0,25] [25,50] [50,100] [100,200] [200,}), method: 'interval' }
52
+ # field :category_string, facet: { sort: 'bucket', size: 10_000 }
53
+ # field :created_at, default: -> { gt Date.today }
54
+
55
+ # scope :shoes_by_brand, ->(brand = nil) { query("shoes").and { manufacturer_name brand } if brand }
56
+ # scope :and_mens do
57
+ # and! { tags "men"}
58
+ # end
59
+
60
+ # end
61
+
62
+ # end
63
+
64
+
65
+ # # n = 500
66
+ # # result = RubyProf.profile do
67
+ # # n.times do
68
+ # q = Product.cloudsearch.query("black jacket").sort(price: :asc).page(1).size(1000).and {
69
+ # or! {
70
+ # tags "men", "women"
71
+ # and! {
72
+ # tags.not "child", "home"
73
+ # }
74
+ # and!.not {
75
+ # tags.start_with "great", "nice"
76
+ # tags.not.start_with "super"
77
+ # tags.not.near "hello world"
78
+ # tags start_with("wifi"), near("electronic")
79
+ # tags term "cool"
80
+ # tags phrase "flash_deal"
81
+ # }
82
+ # or!.not {
83
+ # price 25..100
84
+ # price 100...200
85
+ # price gte(200).lt(300)
86
+ # price gte(300)
87
+ # }
88
+ # or! {
89
+ # created_at Date.today - 7
90
+ # created_at gte(Date.today)
91
+ # created_at gte(Date.today).lt(Date.today + 3)
92
+ # }
93
+ # }
94
+ # }.compile
95
+
96
+ # # end
97
+ # # end
98
+ # # printer = RubyProf::FlatPrinter.new(result)
99
+ # # printer.print(STDOUT, {})
100
+
101
+ # # q = Product.cloudsearch.and {
102
+ # binding.pry
103
+ # # }
104
+
105
+ # end
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.2.5
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Chu
@@ -15,7 +15,7 @@ authors:
15
15
  autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
- date: 2016-01-14 00:00:00.000000000 Z
18
+ date: 2016-01-20 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: aws-sdk
@@ -87,6 +87,20 @@ dependencies:
87
87
  - - '>='
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
+ - !ruby/object:Gem::Dependency
91
+ name: ruby-prof
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
90
104
  description: AWS CloudSearch Query DSL
91
105
  email: dev@retailcommon.com
92
106
  executables: []
@@ -115,6 +129,7 @@ files:
115
129
  - lib/cloud_sesame/query/ast/multi_expression_operator.rb
116
130
  - lib/cloud_sesame/query/ast/near.rb
117
131
  - lib/cloud_sesame/query/ast/not.rb
132
+ - lib/cloud_sesame/query/ast/numeric_value.rb
118
133
  - lib/cloud_sesame/query/ast/operator.rb
119
134
  - lib/cloud_sesame/query/ast/or.rb
120
135
  - lib/cloud_sesame/query/ast/phrase.rb
@@ -153,6 +168,7 @@ files:
153
168
  - lib/cloud_sesame/query/node/request.rb
154
169
  - lib/cloud_sesame/query/node/return.rb
155
170
  - lib/cloud_sesame/query/node/sort.rb
171
+ - profiler.rb
156
172
  - spec/abstract_object_spec.rb
157
173
  - spec/cloud_sesame/domain/base_spec.rb
158
174
  - spec/cloud_sesame/domain/context_spec.rb