CloudSesame 0.1.3 → 0.1.4

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: 64e3bd3d865b5e88973e645777b5eb239ecba731
4
- data.tar.gz: aacdce5cf520442a2ddb233fa7f1e32aa53cfa21
3
+ metadata.gz: f00925c20af3319d8ce8f88dc5dff6387d8d68b6
4
+ data.tar.gz: f175cc69bb9a53b6a7e3c783c67d482d0361d64b
5
5
  SHA512:
6
- metadata.gz: 318149aaa04d9cb4ecd2d62452c880351029c0d4a4e5194e943e72480707295c9a993bccdb5f6522bfccb9deafc5bbe1cd4ad98438b5898b0df302c1019dd169
7
- data.tar.gz: 89e95869db7307f10b161ee28a0b6afd582bcdc2079f34dead7054f32fb412e2019927c4de282eac8b6db7d56cdaf2fb40646af968f4d6d9b9638e31f30ed43f
6
+ metadata.gz: 1eed85f4d9436110b17c7e0b842713daaaf5278014fd20f5a8c2e00931392bfb0d5e66b3ee0f796bb4df36f31753497f43353f1b93826247dbb4b0a2c03ff2f6
7
+ data.tar.gz: 6d4a8daea2e4edfbecbf33c325022295040a0b73ca8e8c9c11e451a23d1e2b49d728319d542a76fac93a73d1ba7a8872f3b0ce77502611519effc572fcbfd304
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- CloudSesame (0.1.2)
4
+ CloudSesame (0.1.3)
5
5
  aws-sdk (~> 2)
6
6
 
7
7
  GEM
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.1.3'
4
- s.date = '2016-01-13'
3
+ s.version = '0.1.4'
4
+ s.date = '2016-01-14'
5
5
  s.summary = "AWS CloudSearch Query Interface"
6
6
  s.description = "AWS CloudSearch Query Interface"
7
7
  s.authors = ['Scott Chu', 'Emily Fan', 'Greg Ward', 'David McHoull',
data/lib/cloud_sesame.rb CHANGED
@@ -8,35 +8,44 @@ require 'forwardable'
8
8
  require 'abstract_object'
9
9
  require 'cloud_sesame/config/credential'
10
10
 
11
+ # Custom Errors
12
+ # ===============================================
11
13
  require 'cloud_sesame/query/error/missing_operator_symbol'
12
14
  require 'cloud_sesame/query/error/missing_query'
13
15
 
14
-
16
+ # Query DSL Methods
17
+ # ===============================================
15
18
  require 'cloud_sesame/query/dsl/base'
19
+ require 'cloud_sesame/query/dsl/query'
20
+ require 'cloud_sesame/query/dsl/page'
21
+ require 'cloud_sesame/query/dsl/sort'
16
22
  require 'cloud_sesame/query/dsl/and'
17
23
  require 'cloud_sesame/query/dsl/or'
18
24
  require 'cloud_sesame/query/dsl/range'
19
25
  require 'cloud_sesame/query/dsl/literal'
26
+ require 'cloud_sesame/query/dsl/literal_helper'
20
27
  require 'cloud_sesame/query/dsl/scope'
21
28
  require 'cloud_sesame/query/dsl/filter_query'
22
29
 
23
-
24
- require 'cloud_sesame/query/dsl'
25
- require 'cloud_sesame/query/builder'
26
-
30
+ # Query Query Filter Query AST Tree
31
+ # ===============================================
27
32
  require 'cloud_sesame/query/ast/multi_branch'
28
33
  require 'cloud_sesame/query/ast/single_branch'
29
- require 'cloud_sesame/query/ast/leaf'
30
34
  require 'cloud_sesame/query/ast/root'
31
- require 'cloud_sesame/query/ast/operator'
35
+ require 'cloud_sesame/query/ast/leaf'
36
+ require 'cloud_sesame/query/ast/multi_expression_operator'
32
37
  require 'cloud_sesame/query/ast/and'
33
38
  require 'cloud_sesame/query/ast/or'
39
+ require 'cloud_sesame/query/ast/single_expression_operator'
34
40
  require 'cloud_sesame/query/ast/not'
35
- require 'cloud_sesame/query/ast/literal'
41
+ require 'cloud_sesame/query/ast/near'
42
+ require 'cloud_sesame/query/ast/prefix'
36
43
  require 'cloud_sesame/query/ast/compound_array'
37
- require 'cloud_sesame/query/ast/prefix_literal'
44
+ require 'cloud_sesame/query/ast/literal'
38
45
  require 'cloud_sesame/query/ast/value'
39
46
 
47
+ # Query Request Nodes
48
+ # ===============================================
40
49
  require 'cloud_sesame/query/node/abstract'
41
50
  require 'cloud_sesame/query/node/request'
42
51
  require 'cloud_sesame/query/node/query'
@@ -48,12 +57,17 @@ require 'cloud_sesame/query/node/facet'
48
57
  require 'cloud_sesame/query/node/page'
49
58
  require 'cloud_sesame/query/node/sort'
50
59
 
60
+ # Query Builder Interface
61
+ # ===============================================
62
+ require 'cloud_sesame/query/builder'
63
+
64
+ # Domain Objects
65
+ # ===============================================
51
66
  require 'cloud_sesame/domain/base'
52
67
  require 'cloud_sesame/domain/client'
53
68
  require 'cloud_sesame/domain/config'
54
69
  require 'cloud_sesame/domain/context'
55
70
 
56
-
57
71
  # Public Interface
58
72
  # ===============================================
59
73
  module CloudSesame
@@ -69,7 +83,16 @@ module CloudSesame
69
83
  end
70
84
 
71
85
  def define_cloudsearch(&block)
72
- cloudsearch.instance_eval &block if block_given?
86
+ if block_given?
87
+ cloudsearch.definition = block
88
+ cloudsearch.instance_eval &block
89
+ end
90
+ end
91
+
92
+ def load_definition_from(klass)
93
+ if klass.respond_to?(:cloudsearch) && klass.cloudsearch.definition
94
+ cloudsearch.instance_eval &klass.cloudsearch.definition
95
+ end
73
96
  end
74
97
 
75
98
  end
@@ -2,18 +2,19 @@ module CloudSesame
2
2
  module Domain
3
3
  class Base
4
4
  extend Forwardable
5
+ include Query::DSL::Scope
5
6
 
6
- attr_reader :searchable_class
7
+ attr_accessor :definition
8
+ attr_reader :searchable
7
9
 
8
10
  def_delegator :client, :config
9
11
 
10
- def_delegators :builder, :query, :terms,
11
- :page, :size,
12
- :sort, :and, :or,
13
- :included?, :excluded?
12
+ def_delegators :builder, :query, :page, :size, :sort,
13
+ :and, :or, :included?, :excluded?,
14
+ :method_context, :method_return, :method_scope
14
15
 
15
- def initialize(searchable_class)
16
- @searchable_class = searchable_class
16
+ def initialize(searchable)
17
+ @searchable = searchable
17
18
  end
18
19
 
19
20
  def client
@@ -21,7 +22,7 @@ module CloudSesame
21
22
  end
22
23
 
23
24
  def builder
24
- @builder ||= CloudSesame::Query::Builder.new context, searchable_class
25
+ @builder ||= CloudSesame::Query::Builder.new context, searchable
25
26
  end
26
27
 
27
28
  # DEFAULT CONTEXT METHODS
@@ -36,22 +37,14 @@ module CloudSesame
36
37
  end
37
38
 
38
39
  def field(name, options = {})
39
- # define filter query fields
40
- context[:filter_query, true][:fields, true][name.to_sym] = {}
41
-
42
- # define query options fields
43
- define_query_options(name, options[:query]) if options[:query]
44
-
45
- # define facet options
46
- define_facet_options(name, options[:facet]) if options[:facet]
40
+ field_name = options[:as] || name
41
+ define_query_options(field_name, options.delete(:query)) if options[:query]
42
+ define_facet_options(field_name, options.delete(:facet)) if options[:facet]
43
+ define_filter_query_field(name, options)
47
44
  end
48
45
 
49
- def define_query_options(name, query_options)
50
- context[:query_options, true][:fields, true][name.to_sym] = format_options(query_options)
51
- end
52
-
53
- def define_facet_options(name, facet_options)
54
- context[:facet, true][name.to_sym] = format_options(facet_options)
46
+ def default_scope(proc, &block)
47
+ scope :default, proc, &block
55
48
  end
56
49
 
57
50
  def scope(name, proc = nil, &block)
@@ -65,6 +58,21 @@ module CloudSesame
65
58
  options.is_a?(Hash) ? options : {}
66
59
  end
67
60
 
61
+ def define_filter_query_field(name, options)
62
+ if (as = options[:as]) && (existing_options = context[:filter_query, true][:fields, true].delete(as))
63
+ options.merge!(existing_options)
64
+ end
65
+ context[:filter_query, true][:fields, true][name.to_sym] = options
66
+ end
67
+
68
+ def define_query_options(name, options)
69
+ context[:query_options, true][:fields, true][name.to_sym] = format_options(options)
70
+ end
71
+
72
+ def define_facet_options(name, options)
73
+ context[:facet, true][name.to_sym] = format_options(options)
74
+ end
75
+
68
76
  end
69
77
  end
70
78
  end
@@ -16,6 +16,10 @@ module CloudSesame
16
16
  table[key] = value
17
17
  end
18
18
 
19
+ def delete(key)
20
+ table.delete key
21
+ end
22
+
19
23
  def each(&block)
20
24
  table.each &block
21
25
  end
@@ -1,7 +1,7 @@
1
1
  module CloudSesame
2
2
  module Query
3
3
  module AST
4
- class And < Operator
4
+ class And < MultiExpressionOperator
5
5
  self.symbol = :and
6
6
  end
7
7
  end
@@ -9,7 +9,6 @@ module CloudSesame
9
9
 
10
10
  def field=(field)
11
11
  self.parent = nil
12
- self.literal = AST::Literal
13
12
  @field = field
14
13
  end
15
14
 
@@ -20,21 +19,30 @@ module CloudSesame
20
19
 
21
20
  # SINGLE BRANCH OPERATOR
22
21
  # =======================================
22
+
23
+ # NOT
24
+ # =======================================
23
25
  def not(*values)
24
26
  self.parent = AST::Not
25
- self.literal = AST::Literal
26
- insert_children(values)
27
- return self
27
+ insert_and_return_children(values)
28
28
  end
29
29
 
30
30
  alias_method :is_not, :not
31
31
 
32
+ # NEAR
33
+ # =======================================
34
+ def near(*values)
35
+ self.parent = AST::Near
36
+ insert_and_return_children(values)
37
+ end
38
+
39
+ alias_method :sloppy, :near
40
+
32
41
  # PREFIX LITERAL
33
42
  # =======================================
34
43
  def prefix(*values)
35
- self.literal = AST::PrefixLiteral
36
- insert_children(values)
37
- return self
44
+ self.parent = AST::Prefix
45
+ insert_and_return_children(values)
38
46
  end
39
47
 
40
48
  alias_method :start_with, :prefix
@@ -44,21 +52,22 @@ module CloudSesame
44
52
  # =======================================
45
53
  # def range
46
54
  # self.literal = AST::PrefixLiteral
47
- # insert_children(values)
55
+ # insert_and_return_children(values)
48
56
  # return self
49
57
  # end
50
58
 
51
59
  # alias_method :start_with, :prefix
52
60
 
53
- def insert_children(values = [])
61
+ def insert_and_return_children(values = [])
54
62
  values.each do |value|
55
63
  if parent
56
64
  self << (node = parent.new scope.context)
57
- node.child = literal.new(field, value, options)
65
+ node.child = AST::Literal.new(field, value, options)
58
66
  else
59
- self << literal.new(field, value, options)
67
+ self << AST::Literal.new(field, value, options)
60
68
  end
61
69
  end
70
+ return self
62
71
  end
63
72
 
64
73
  private
@@ -13,12 +13,36 @@ module CloudSesame
13
13
  (options[:included] ||= []) << value
14
14
  end
15
15
 
16
+ def detailed
17
+ options[:detailed] = true
18
+ return self
19
+ end
20
+
16
21
  def value=(value)
17
22
  @value = Value.new(value)
18
23
  end
19
24
 
20
25
  def compile
21
- "#{ field }:#{ value.compile }"
26
+ options[:detailed] ? long_format : short_format
27
+ end
28
+
29
+ def as_field
30
+ options[:as] || field
31
+ end
32
+
33
+ private
34
+
35
+ def short_format
36
+ "#{ as_field }:#{ value.compile }"
37
+ end
38
+
39
+
40
+ def long_format
41
+ "field=#{ escape as_field } #{ value.compile }"
42
+ end
43
+
44
+ def escape(data = "")
45
+ "'#{ data.to_s.gsub(/\'/) { "\\'" } }'"
22
46
  end
23
47
 
24
48
  end
@@ -1,7 +1,7 @@
1
1
  module CloudSesame
2
2
  module Query
3
3
  module AST
4
- class Operator < MultiBranch
4
+ class MultiExpressionOperator < MultiBranch
5
5
 
6
6
  # Operator Symbol Writer
7
7
  def self.symbol=(symbol)
@@ -0,0 +1,15 @@
1
+ module CloudSesame
2
+ module Query
3
+ module AST
4
+ class Near < SingleExpressionOperator
5
+ self.symbol = :near
6
+
7
+ def compile
8
+ child.detailed
9
+ super
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,12 +1,8 @@
1
1
  module CloudSesame
2
2
  module Query
3
3
  module AST
4
- class Not < SingleBranch
5
-
6
- def compile
7
- "(not #{ child.compile })"
8
- end
9
-
4
+ class Not < SingleExpressionOperator
5
+ self.symbol = :not
10
6
  end
11
7
  end
12
8
  end
@@ -1,7 +1,7 @@
1
1
  module CloudSesame
2
2
  module Query
3
3
  module AST
4
- class Or < Operator
4
+ class Or < MultiExpressionOperator
5
5
  self.symbol = :or
6
6
  end
7
7
  end
@@ -0,0 +1,15 @@
1
+ module CloudSesame
2
+ module Query
3
+ module AST
4
+ class Prefix < SingleExpressionOperator
5
+ self.symbol = :prefix
6
+
7
+ def compile
8
+ child.detailed
9
+ super
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ module CloudSesame
2
+ module Query
3
+ module AST
4
+ class SingleExpressionOperator < SingleBranch
5
+
6
+ # Operator Symbol Writer
7
+ def self.symbol=(symbol)
8
+ @symbol = symbol
9
+ end
10
+
11
+ # Operator Symbol Getter
12
+ def self.symbol
13
+ @symbol
14
+ end
15
+
16
+ def compile
17
+ raise Error::MissingOperatorSymbol if self.class.symbol.nil?
18
+ "(#{ self.class.symbol } #{ child.compile })" if child
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end
@@ -3,57 +3,31 @@ module CloudSesame
3
3
  class Builder
4
4
  include DSL::Base
5
5
  include DSL::FilterQuery
6
+ include DSL::Page
7
+ include DSL::Query
8
+ include DSL::Sort
6
9
 
7
- attr_accessor :context, :searchable_class
10
+ attr_reader :context, :searchable, :result
8
11
 
9
- def initialize(default_context, searchable_class)
12
+ def initialize(default_context, searchable)
10
13
  @context = default_context
11
- @searchable_class = searchable_class
14
+ @searchable = searchable
12
15
  end
13
16
 
14
17
  def request
15
- @request ||= Node::Request.new context.dup
18
+ @request ||= (clear_result; Node::Request.new context.dup)
16
19
  end
17
20
 
18
- def reset
21
+ def clear_request
19
22
  @request = nil
20
23
  end
21
24
 
22
- def inspect
23
- "#<CloudSesame::Query::Builder:#{ object_id } #{ request.compile }>"
24
- end
25
-
26
- # CHAINABLE METHODS
27
- # =========================================
28
-
29
- def query(string)
30
- request.query.query = string
31
- return self
32
- end
33
-
34
- def terms(*terms)
35
- request.query.terms.concat terms
36
- return self
25
+ def clear_result
26
+ @result = nil
37
27
  end
38
28
 
39
- def exclude_terms(*terms)
40
- request.query.terms.concat terms.map { |t| "-#{ t }" }
41
- return self
42
- end
43
-
44
- def page(value)
45
- request.page.page = value.to_i
46
- return self
47
- end
48
-
49
- def size(value)
50
- request.page.size = value.to_i
51
- return self
52
- end
53
-
54
- def sort(hash = {})
55
- hash.each { |key, value| request.sort[key] = value }
56
- return self
29
+ def inspect
30
+ "#<CloudSesame::Query::Builder:#{ object_id } #{ request.compile }>"
57
31
  end
58
32
 
59
33
  # ENDING METHODS
@@ -61,10 +35,9 @@ module CloudSesame
61
35
 
62
36
  def search
63
37
  compiled = request.compile
64
- raise Error::MissingQuery.new("Query can not be empty!") unless compiled[:query] && !compiled[:query].empty?
65
- result = searchable_class.cloudsearch.client.search compiled
66
- reset
67
- result
38
+ raise Error::MissingQuery.new("Query or FilterQuery can not be empty!") if !compiled[:query] || compiled[:query].empty?
39
+ clear_request
40
+ @result = searchable.cloudsearch.client.search compiled
68
41
  end
69
42
 
70
43
  private
@@ -6,6 +6,7 @@ module CloudSesame
6
6
  include And
7
7
  include Or
8
8
  include Literal
9
+ include LiteralHelper
9
10
 
10
11
  # { fields: { tags: { excluded: [100] } } }
11
12
  def included?(field, value = nil)
@@ -11,14 +11,6 @@ module CloudSesame
11
11
  node
12
12
  end
13
13
 
14
- def date(date_object)
15
- strip date_object.strftime('%FT%TZ')
16
- end
17
-
18
- def strip(string)
19
- string.gsub(/ /, '')
20
- end
21
-
22
14
  private
23
15
 
24
16
  def fields
@@ -28,8 +20,7 @@ module CloudSesame
28
20
  def method_missing(field, *values, &block)
29
21
  if fields && (options = fields[field])
30
22
  method_scope.children.field = field
31
- method_scope.children.insert_children(values)
32
- method_scope.children
23
+ method_scope.children.insert_and_return_children(values)
33
24
  else
34
25
  super
35
26
  end
@@ -0,0 +1,17 @@
1
+ module CloudSesame
2
+ module Query
3
+ module DSL
4
+ module LiteralHelper
5
+
6
+ def d(date_object)
7
+ strip date_object.strftime('%FT%TZ')
8
+ end
9
+
10
+ def strip(string)
11
+ string.gsub(/ /, '')
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,27 @@
1
+ module CloudSesame
2
+ module Query
3
+ module DSL
4
+ module Page
5
+
6
+ def page(input = nil)
7
+ if input
8
+ request.page.page = input.to_i
9
+ return self
10
+ else
11
+ request.page.page
12
+ end
13
+ end
14
+
15
+ def size(input)
16
+ if input
17
+ request.page.size = input.to_i
18
+ return self
19
+ else
20
+ request.page.size
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,18 @@
1
+ module CloudSesame
2
+ module Query
3
+ module DSL
4
+ module Query
5
+
6
+ def query(input = nil)
7
+ if input
8
+ request.query.query = input
9
+ return self
10
+ else
11
+ request.query.query
12
+ end
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
@@ -11,7 +11,7 @@ module CloudSesame
11
11
 
12
12
  def method_missing(name, *args, &block)
13
13
  if scopes && (callback = scopes[name])
14
- method_scope.instance_exec *args, &callback
14
+ self.instance_exec *args, &callback
15
15
  method_return
16
16
  else
17
17
  super
@@ -0,0 +1,20 @@
1
+ module CloudSesame
2
+ module Query
3
+ module DSL
4
+ module Sort
5
+
6
+ def sort(input = nil)
7
+ if input.is_a? Hash
8
+ input.each { |key, value| request.sort[key] = value }
9
+ return self
10
+ elsif input
11
+ request.sort[input]
12
+ else
13
+ request.sort.sorting_attributes
14
+ end
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
@@ -9,7 +9,7 @@ module CloudSesame
9
9
 
10
10
  describe '#initalize' do
11
11
  it 'should set searchable class' do
12
- expect(subject.searchable_class).to eq "Test"
12
+ expect(subject.searchable).to eq "Test"
13
13
  end
14
14
  end
15
15
 
@@ -3,14 +3,14 @@ require "spec_helper"
3
3
  module CloudSesame
4
4
  module Query
5
5
  module AST
6
- describe Operator do
6
+ describe MultiExpressionOperator do
7
7
  let(:proc) { Proc.new {} }
8
- let(:operator) { Operator.new({}, &proc )}
9
- before { Operator.symbol = :symbol }
8
+ let(:operator) { MultiExpressionOperator.new({}, &proc )}
9
+ before { MultiExpressionOperator.symbol = :symbol }
10
10
 
11
11
  describe '#compile' do
12
12
  it 'should raise an error if operator symbol has not being set' do
13
- Operator.symbol = nil
13
+ MultiExpressionOperator.symbol = nil
14
14
  expect{ operator.compile }.to raise_error(Error::MissingOperatorSymbol)
15
15
  end
16
16
 
@@ -1,58 +1,63 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe CloudSesame, focus: true do
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
+ # CloudSesame::Domain::Client.configure do |config|
13
+ # config.access_key = ENV['AWS_ACCESS_KEY_ID']
14
+ # config.secret_key = ENV['AWS_SECRET_ACCESS_KEY']
15
+ # end
16
+
17
+ # # Usage Example
18
+ # class Product
19
+ # include CloudSesame
20
+
21
+ # define_cloudsearch do
22
+ # # Product CloudSesame Config
23
+ # config.endpoint = ENV['AWS_ENDPOINT']
24
+ # config.region = ENV['AWS_REGION']
25
+
26
+ # default_size 100
27
+ # field :searchable_text, query: { weight: 2 }
28
+ # field :description, query: true
29
+ # field :tags
30
+
31
+ # field :affiliate_advertiser_ext_id, facet: { size: 50 }
32
+ # field :currency, facet: true
33
+ # field :discount_percentage, facet: { buckets: %w([10,100] [25,100] [50,100] [70,100]), method: 'interval' }
34
+ # field :manufacturer_name, facet: { size: 50 }
35
+ # field :price, facet: { buckets: %w([0,25] [25,50] [50,100] [100,200] [200,}), method: 'interval' }
36
+ # field :category_string, facet: { sort: 'bucket', size: 10_000 }
37
+ # field :created_at
38
+
39
+ # scope :men_tag, -> { tags "men" }
40
+ # scope :and_mens, -> { and! { tags "men"} }
41
+
42
+ # end
43
+
44
+ # end
45
+
46
+ # class NewProduct < Product
47
+ # load_definition_from Product
48
+
49
+ # define_cloudsearch do
50
+ # field :searchable_text, query: { weight: 4 }
51
+ # end
52
+ # end
53
+
54
+ # # Example Query
55
+ # # result = Product.cloudsearch.query("shoes")
56
+ # # .page(3)
57
+ # # .or {
58
+ # # tags.not.near "men", "women"
59
+ # # }
4
60
 
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
- CloudSesame::Domain::Client.configure do |config|
13
- config.access_key = ENV['AWS_ACCESS_KEY_ID']
14
- config.secret_key = ENV['AWS_SECRET_ACCESS_KEY']
15
- end
16
-
17
- # Usage Example
18
- class Product
19
- include CloudSesame
20
-
21
- define_cloudsearch do
22
-
23
- # Product CloudSesame Config
24
- config.endpoint = ENV['AWS_ENDPOINT']
25
- config.region = ENV['AWS_REGION']
26
-
27
- default_size 100
28
-
29
- field :searchable_text, query: { weight: 2 }
30
- field :description, query: true
31
- field :tags
32
-
33
- field :affiliate_advertiser_ext_id, facet: { size: 50 }
34
- field :currency, facet: true
35
- field :discount_percentage, facet: { buckets: %w([10,100] [25,100] [50,100] [70,100]), method: 'interval' }
36
- field :manufacturer_name, facet: { size: 50 }
37
- field :price, facet: { buckets: %w([0,25] [25,50] [50,100] [100,200] [200,}), method: 'interval' }
38
- field :category_string, facet: { sort: 'bucket', size: 10_000 }
39
- field :created_at
40
-
41
- scope :men_tag, -> { tags "men" }
42
- scope :and_mens, -> { and! { tags "men"} }
43
-
44
- end
45
-
46
- end
47
-
48
- result = Product.cloudsearch.query("shoes")
49
- .page(3)
50
- .or {
51
- tags.not.start_with 'home', 'outdoor'
52
- price.start_with(100)
53
- }
54
-
55
- # result.included?(price: 100)
56
61
  # binding.pry
57
62
 
58
63
  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.1.3
4
+ version: 0.1.4
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-13 00:00:00.000000000 Z
18
+ date: 2016-01-14 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: aws-sdk
@@ -111,22 +111,27 @@ files:
111
111
  - lib/cloud_sesame/query/ast/leaf.rb
112
112
  - lib/cloud_sesame/query/ast/literal.rb
113
113
  - lib/cloud_sesame/query/ast/multi_branch.rb
114
+ - lib/cloud_sesame/query/ast/multi_expression_operator.rb
115
+ - lib/cloud_sesame/query/ast/near.rb
114
116
  - lib/cloud_sesame/query/ast/not.rb
115
- - lib/cloud_sesame/query/ast/operator.rb
116
117
  - lib/cloud_sesame/query/ast/or.rb
117
- - lib/cloud_sesame/query/ast/prefix_literal.rb
118
+ - lib/cloud_sesame/query/ast/prefix.rb
118
119
  - lib/cloud_sesame/query/ast/root.rb
119
120
  - lib/cloud_sesame/query/ast/single_branch.rb
121
+ - lib/cloud_sesame/query/ast/single_expression_operator.rb
120
122
  - lib/cloud_sesame/query/ast/value.rb
121
123
  - lib/cloud_sesame/query/builder.rb
122
- - lib/cloud_sesame/query/dsl.rb
123
124
  - lib/cloud_sesame/query/dsl/and.rb
124
125
  - lib/cloud_sesame/query/dsl/base.rb
125
126
  - lib/cloud_sesame/query/dsl/filter_query.rb
126
127
  - lib/cloud_sesame/query/dsl/literal.rb
128
+ - lib/cloud_sesame/query/dsl/literal_helper.rb
127
129
  - lib/cloud_sesame/query/dsl/or.rb
130
+ - lib/cloud_sesame/query/dsl/page.rb
131
+ - lib/cloud_sesame/query/dsl/query.rb
128
132
  - lib/cloud_sesame/query/dsl/range.rb
129
133
  - lib/cloud_sesame/query/dsl/scope.rb
134
+ - lib/cloud_sesame/query/dsl/sort.rb
130
135
  - lib/cloud_sesame/query/error/missing_operator_symbol.rb
131
136
  - lib/cloud_sesame/query/error/missing_query.rb
132
137
  - lib/cloud_sesame/query/node/abstract.rb
@@ -145,7 +150,7 @@ files:
145
150
  - spec/cloud_sesame/query/ast/and_spec.rb
146
151
  - spec/cloud_sesame/query/ast/literal_spec.rb
147
152
  - spec/cloud_sesame/query/ast/multi_branch_spec.rb
148
- - spec/cloud_sesame/query/ast/operator_spec.rb
153
+ - spec/cloud_sesame/query/ast/multi_expression_operator_spec.rb
149
154
  - spec/cloud_sesame/query/ast/or_spec.rb
150
155
  - spec/cloud_sesame/query/ast/root_spec.rb
151
156
  - spec/cloud_sesame/query/ast/value_spec.rb
@@ -196,7 +201,7 @@ test_files:
196
201
  - spec/cloud_sesame/query/ast/and_spec.rb
197
202
  - spec/cloud_sesame/query/ast/literal_spec.rb
198
203
  - spec/cloud_sesame/query/ast/multi_branch_spec.rb
199
- - spec/cloud_sesame/query/ast/operator_spec.rb
204
+ - spec/cloud_sesame/query/ast/multi_expression_operator_spec.rb
200
205
  - spec/cloud_sesame/query/ast/or_spec.rb
201
206
  - spec/cloud_sesame/query/ast/root_spec.rb
202
207
  - spec/cloud_sesame/query/ast/value_spec.rb
@@ -1,17 +0,0 @@
1
- module CloudSesame
2
- module Query
3
- module AST
4
- class PrefixLiteral < Literal
5
-
6
- def compile
7
- "(prefix field=#{ escape(field) } #{ value.compile })"
8
- end
9
-
10
- def escape(data = "")
11
- "'#{ data.to_s.gsub(/\'/) { "\\'" } }'"
12
- end
13
-
14
- end
15
- end
16
- end
17
- end
@@ -1,62 +0,0 @@
1
- # module CloudSesame
2
- # module Query
3
- # module DSL
4
-
5
- # # CLAUSE: AND
6
- # # =========================================
7
- # def and(&block)
8
- # filter_query.children << AST::And.new(context, &block)
9
- # return filter_query
10
- # end
11
-
12
- # alias_method :all, :and
13
- # alias_method :and!, :and
14
- # alias_method :+, :and
15
-
16
- # # CLAUSE: OR
17
- # # =========================================
18
- # def or(&block)
19
- # filter_query.children << AST::Or.new(context, &block)
20
- # return filter_query
21
- # end
22
-
23
- # alias_method :any, :or
24
- # alias_method :or!, :or
25
-
26
- # # CLAUSE: LITERAL
27
- # # =========================================
28
- # def literal(field, value, options = {})
29
- # node = AST::Literal.new(field, value, options)
30
- # filter_query.children << node
31
- # node
32
- # end
33
-
34
- # def prefix(literals)
35
- # literals.each { |literal| literal.options[:prefix] = true }
36
- # return filter_query
37
- # end
38
-
39
- # private
40
-
41
- # def filter_query
42
- # self
43
- # end
44
-
45
- # def scopes
46
- # filter_query.context[:scopes]
47
- # end
48
-
49
- # def method_missing(field, *values, &block)
50
- # if context[:fields] && (options = context[:fields][field])
51
- # values.map { |value| literal(field, value, options) }
52
- # elsif scope && (callback = scope[field])
53
- # filter_query.instance_exec *values, &callback
54
- # return filter_query
55
- # else
56
- # super
57
- # end
58
- # end
59
-
60
- # end
61
- # end
62
- # end