eson-dsl 0.7.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.
Files changed (240) hide show
  1. data/LICENSE.md +20 -0
  2. data/README.md +179 -0
  3. data/Rakefile +30 -0
  4. data/TODO.md +1 -0
  5. data/eson-dsl.gemspec +21 -0
  6. data/examples/facets/date_histogram.rb +5 -0
  7. data/examples/facets/filter.rb +7 -0
  8. data/examples/facets/geo_distance.rb +14 -0
  9. data/examples/facets/histogram.rb +5 -0
  10. data/examples/facets/query.rb +7 -0
  11. data/examples/facets/range.rb +8 -0
  12. data/examples/facets/scoped.rb +17 -0
  13. data/examples/facets/statistical.rb +5 -0
  14. data/examples/facets/term_stats.rb +9 -0
  15. data/examples/facets/terms.rb +8 -0
  16. data/examples/filters/and.rb +11 -0
  17. data/examples/filters/and_without_keyword.rb +9 -0
  18. data/examples/filters/bool.rb +16 -0
  19. data/examples/filters/exists.rb +9 -0
  20. data/examples/filters/fquery.rb +11 -0
  21. data/examples/filters/geo_bounding_box.rb +8 -0
  22. data/examples/filters/geo_distance.rb +8 -0
  23. data/examples/filters/geo_distance_alternate.rb +9 -0
  24. data/examples/filters/geo_distance_range.rb +10 -0
  25. data/examples/filters/geo_polygon.rb +10 -0
  26. data/examples/filters/has_child.rb +9 -0
  27. data/examples/filters/ids.rb +8 -0
  28. data/examples/filters/missing.rb +9 -0
  29. data/examples/filters/not.rb +10 -0
  30. data/examples/filters/numeric_range.rb +9 -0
  31. data/examples/filters/or.rb +11 -0
  32. data/examples/filters/range.rb +5 -0
  33. data/examples/filters/type.rb +5 -0
  34. data/examples/queries/bool.rb +16 -0
  35. data/examples/queries/boosting.rb +12 -0
  36. data/examples/queries/constant_score.rb +9 -0
  37. data/examples/queries/constant_score_with_filter.rb +9 -0
  38. data/examples/queries/custom_score.rb +15 -0
  39. data/examples/queries/dis_max.rb +10 -0
  40. data/examples/queries/field.rb +5 -0
  41. data/examples/queries/filters_and_facets.rb +11 -0
  42. data/examples/queries/flt.rb +7 -0
  43. data/examples/queries/flt_field.rb +7 -0
  44. data/examples/queries/fuzzy.rb +5 -0
  45. data/examples/queries/fuzzy_complex.rb +5 -0
  46. data/examples/queries/has_child.rb +9 -0
  47. data/examples/queries/has_child_complex.rb +12 -0
  48. data/examples/queries/ids.rb +5 -0
  49. data/examples/queries/match_all.rb +5 -0
  50. data/examples/queries/mlt.rb +7 -0
  51. data/examples/queries/mlt_field.rb +7 -0
  52. data/examples/queries/nested.rb +12 -0
  53. data/examples/queries/prefix.rb +5 -0
  54. data/examples/queries/prefix_short.rb +5 -0
  55. data/examples/queries/query_string.rb +6 -0
  56. data/examples/queries/query_string_with_multiple_fields.rb +7 -0
  57. data/examples/queries/query_string_without_default_field.rb +5 -0
  58. data/examples/queries/range.rb +5 -0
  59. data/examples/queries/span_first.rb +7 -0
  60. data/examples/queries/span_near.rb +11 -0
  61. data/examples/queries/span_not.rb +8 -0
  62. data/examples/queries/span_or.rb +11 -0
  63. data/examples/queries/span_term.rb +5 -0
  64. data/examples/queries/term.rb +5 -0
  65. data/examples/queries/term_with_parameters.rb +5 -0
  66. data/examples/queries/terms.rb +5 -0
  67. data/examples/queries/text.rb +5 -0
  68. data/examples/queries/top_children.rb +7 -0
  69. data/examples/queries/wildcard.rb +5 -0
  70. data/examples/queries/wildcard_short.rb +5 -0
  71. data/lib/eson/modules/query_plugin.rb +44 -0
  72. data/lib/eson/search/and.rb +27 -0
  73. data/lib/eson/search/base_query.rb +39 -0
  74. data/lib/eson/search/bool.rb +51 -0
  75. data/lib/eson/search/boosting.rb +45 -0
  76. data/lib/eson/search/constant_score.rb +21 -0
  77. data/lib/eson/search/custom_score.rb +19 -0
  78. data/lib/eson/search/date_histogram.rb +13 -0
  79. data/lib/eson/search/dis_max.rb +22 -0
  80. data/lib/eson/search/exists.rb +18 -0
  81. data/lib/eson/search/facet.rb +39 -0
  82. data/lib/eson/search/facets.rb +37 -0
  83. data/lib/eson/search/field.rb +16 -0
  84. data/lib/eson/search/field_based.rb +24 -0
  85. data/lib/eson/search/filter.rb +28 -0
  86. data/lib/eson/search/filter_facet.rb +13 -0
  87. data/lib/eson/search/filters.rb +69 -0
  88. data/lib/eson/search/fquery.rb +22 -0
  89. data/lib/eson/search/fuzzy.rb +29 -0
  90. data/lib/eson/search/fuzzy_like_this.rb +16 -0
  91. data/lib/eson/search/fuzzy_like_this_field.rb +20 -0
  92. data/lib/eson/search/geo_bounding_box.rb +35 -0
  93. data/lib/eson/search/geo_distance.rb +34 -0
  94. data/lib/eson/search/geo_distance_range.rb +29 -0
  95. data/lib/eson/search/geo_polygon.rb +32 -0
  96. data/lib/eson/search/has_child.rb +29 -0
  97. data/lib/eson/search/histogram.rb +20 -0
  98. data/lib/eson/search/ids.rb +27 -0
  99. data/lib/eson/search/match_all.rb +21 -0
  100. data/lib/eson/search/missing.rb +21 -0
  101. data/lib/eson/search/more_like_this.rb +16 -0
  102. data/lib/eson/search/more_like_this_field.rb +20 -0
  103. data/lib/eson/search/nested.rb +24 -0
  104. data/lib/eson/search/node.rb +28 -0
  105. data/lib/eson/search/not.rb +23 -0
  106. data/lib/eson/search/numeric_range.rb +20 -0
  107. data/lib/eson/search/or.rb +23 -0
  108. data/lib/eson/search/parametrized.rb +15 -0
  109. data/lib/eson/search/prefix.rb +22 -0
  110. data/lib/eson/search/queries.rb +65 -0
  111. data/lib/eson/search/query.rb +28 -0
  112. data/lib/eson/search/query_facet.rb +16 -0
  113. data/lib/eson/search/query_field.rb +33 -0
  114. data/lib/eson/search/query_group.rb +34 -0
  115. data/lib/eson/search/query_string.rb +20 -0
  116. data/lib/eson/search/range.rb +26 -0
  117. data/lib/eson/search/span_first.rb +27 -0
  118. data/lib/eson/search/span_near.rb +29 -0
  119. data/lib/eson/search/span_not.rb +29 -0
  120. data/lib/eson/search/span_or.rb +29 -0
  121. data/lib/eson/search/span_term.rb +18 -0
  122. data/lib/eson/search/statistical.rb +20 -0
  123. data/lib/eson/search/sub_query.rb +7 -0
  124. data/lib/eson/search/term.rb +22 -0
  125. data/lib/eson/search/terms.rb +22 -0
  126. data/lib/eson/search/terms_stats.rb +20 -0
  127. data/lib/eson/search/text.rb +23 -0
  128. data/lib/eson/search/top_children.rb +28 -0
  129. data/lib/eson/search/type.rb +20 -0
  130. data/lib/eson/search/wildcard.rb +18 -0
  131. data/lib/eson-dsl.rb +64 -0
  132. data/log4j.properties +18 -0
  133. data/test/search/facet_test.rb +92 -0
  134. data/test/search/facets/date_histogram.documents +1 -0
  135. data/test/search/facets/date_histogram.mapping +1 -0
  136. data/test/search/facets/date_histogram.rb +13 -0
  137. data/test/search/facets/geo_distance.documents +1 -0
  138. data/test/search/facets/geo_distance.mapping +8 -0
  139. data/test/search/facets/geo_distance.rb +1 -0
  140. data/test/search/facets/histogram.documents +1 -0
  141. data/test/search/facets/histogram.rb +13 -0
  142. data/test/search/facets/query.documents +1 -0
  143. data/test/search/facets/query.rb +14 -0
  144. data/test/search/facets/range.documents +1 -0
  145. data/test/search/facets/range.rb +17 -0
  146. data/test/search/facets/scoped.documents +1 -0
  147. data/test/search/facets/scoped.json +1 -0
  148. data/test/search/facets/scoped.mapping +9 -0
  149. data/test/search/facets/statistical.documents +1 -0
  150. data/test/search/facets/statistical.rb +12 -0
  151. data/test/search/facets/tag_facet.documents +1 -0
  152. data/test/search/facets/tag_facet.rb +14 -0
  153. data/test/search/facets/terms.rb +14 -0
  154. data/test/search/facets/terms_stats.documents +1 -0
  155. data/test/search/facets/terms_stats.json +1 -0
  156. data/test/search/facets/terms_stats.rb +13 -0
  157. data/test/search/filters/and.rb +15 -0
  158. data/test/search/filters/bool.json +1 -0
  159. data/test/search/filters/bool.rb +27 -0
  160. data/test/search/filters/exists.json +1 -0
  161. data/test/search/filters/exists.rb +1 -0
  162. data/test/search/filters/filter_query.rb +14 -0
  163. data/test/search/filters/geo_bounding_box_hash.documents +1 -0
  164. data/test/search/filters/geo_bounding_box_hash.json +1 -0
  165. data/test/search/filters/geo_bounding_box_hash.mapping +8 -0
  166. data/test/search/filters/geo_distance_hash.documents +1 -0
  167. data/test/search/filters/geo_distance_hash.json +1 -0
  168. data/test/search/filters/geo_distance_hash.mapping +8 -0
  169. data/test/search/filters/geo_distance_range_hash.documents +1 -0
  170. data/test/search/filters/geo_distance_range_hash.json +1 -0
  171. data/test/search/filters/geo_distance_range_hash.mapping +8 -0
  172. data/test/search/filters/geo_polygon_hash.documents +1 -0
  173. data/test/search/filters/geo_polygon_hash.json +1 -0
  174. data/test/search/filters/geo_polygon_hash.mapping +8 -0
  175. data/test/search/filters/has_child.blog.mapping +1 -0
  176. data/test/search/filters/has_child.blog_tag.mapping +1 -0
  177. data/test/search/filters/has_child.rb +15 -0
  178. data/test/search/filters/ids.rb +14 -0
  179. data/test/search/filters/missing.rb +1 -0
  180. data/test/search/filters/not.rb +16 -0
  181. data/test/search/filters/numeric_range.documents +1 -0
  182. data/test/search/filters/numeric_range.rb +1 -0
  183. data/test/search/filters/or.rb +15 -0
  184. data/test/search/filters/range.rb +16 -0
  185. data/test/search/filters/type.json +1 -0
  186. data/test/search/filters/type.rb +1 -0
  187. data/test/search/filters_test.rb +166 -0
  188. data/test/search/queries/bool.json +1 -0
  189. data/test/search/queries/bool.rb +21 -0
  190. data/test/search/queries/boosting.json +1 -0
  191. data/test/search/queries/boosting.rb +17 -0
  192. data/test/search/queries/constant_score.rb +10 -0
  193. data/test/search/queries/constant_score_filter.rb +10 -0
  194. data/test/search/queries/custom_score.documents +1 -0
  195. data/test/search/queries/custom_score.rb +14 -0
  196. data/test/search/queries/dis_max.rb +15 -0
  197. data/test/search/queries/field.rb +7 -0
  198. data/test/search/queries/filters_and_facets.documents +1 -0
  199. data/test/search/queries/filters_and_facets.json +1 -0
  200. data/test/search/queries/flt.rb +9 -0
  201. data/test/search/queries/flt_field.rb +10 -0
  202. data/test/search/queries/fuzzy_complex.rb +5 -0
  203. data/test/search/queries/fuzzy_simple.rb +5 -0
  204. data/test/search/queries/has_child.blog.mapping +1 -0
  205. data/test/search/queries/has_child.blog_tag.mapping +1 -0
  206. data/test/search/queries/has_child.rb +10 -0
  207. data/test/search/queries/has_child_complex.blog.mapping +1 -0
  208. data/test/search/queries/has_child_complex.blog_tag.mapping +1 -0
  209. data/test/search/queries/has_child_complex.rb +17 -0
  210. data/test/search/queries/ids.rb +1 -0
  211. data/test/search/queries/match_all.rb +1 -0
  212. data/test/search/queries/mlt.json +1 -0
  213. data/test/search/queries/mlt.rb +9 -0
  214. data/test/search/queries/mlt_field.rb +10 -0
  215. data/test/search/queries/nested.json +1 -0
  216. data/test/search/queries/nested.mapping +9 -0
  217. data/test/search/queries/phrase_prefix.rb +8 -0
  218. data/test/search/queries/prefix.rb +1 -0
  219. data/test/search/queries/prefix_short.rb +1 -0
  220. data/test/search/queries/query_string.rb +8 -0
  221. data/test/search/queries/query_string_with_multiple_fields.rb +9 -0
  222. data/test/search/queries/query_string_without_default_field.rb +7 -0
  223. data/test/search/queries/range.rb +11 -0
  224. data/test/search/queries/span_near.json +1 -0
  225. data/test/search/queries/span_not.json +1 -0
  226. data/test/search/queries/span_or.json +1 -0
  227. data/test/search/queries/span_term.json +1 -0
  228. data/test/search/queries/term.json +1 -0
  229. data/test/search/queries/term.rb +1 -0
  230. data/test/search/queries/terms.rb +1 -0
  231. data/test/search/queries/text.json +1 -0
  232. data/test/search/queries/text.rb +8 -0
  233. data/test/search/queries/top_children.blog.mapping +1 -0
  234. data/test/search/queries/top_children.blog_tag.mapping +1 -0
  235. data/test/search/queries/top_children.rb +11 -0
  236. data/test/search/queries/wildcard.rb +1 -0
  237. data/test/search/queries/wildcard_short.rb +1 -0
  238. data/test/search/query_test.rb +311 -0
  239. data/test/test_config.rb +157 -0
  240. metadata +413 -0
@@ -0,0 +1,5 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ fuzzy :user => "ki"
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ fuzzy :user, :value => "ki", :boost => 1.0
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ has_child :blog_tag do
4
+ query do
5
+ term :tag => "something"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ has_child :blog_tag do
4
+ query do
5
+ term :tag => "something"
6
+ end
7
+ filter do
8
+ term :tag => "other"
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ ids("user", [1,2,3,4,5,6,7])
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ match_all :boost => 2.0
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ mlt :fields => ["name.first", "name.last"],
4
+ :like_text => "text like this one",
5
+ :max_query_terms => 12
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ mlt_field "name.first",
4
+ :like_text => "text like this one",
5
+ :max_query_terms => 12
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ nested :path => :obj1, :score_mode => "avg" do
4
+ query do
5
+ match_all
6
+ end
7
+ filters do
8
+ exists :field => "user"
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ prefix "user", :value => "sh", :boost => 2.0
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ prefix "user" => "sh"
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ query_string :default_field => "content",
4
+ :query => "this AND that OR thus"
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ query_string :fields => ["content", "name^5"],
4
+ :query => "this AND that OR thus",
5
+ :use_dis_max => true
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ query_string "this AND that OR thus"
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ range(:age, :from => 10, :to => 20)
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ span_first :end => 3 do
4
+ span_term :field => "value1"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ span_near :slop => 12, :in_order => false, :collect_payloads => false do
4
+ clauses do
5
+ span_term :field => "value1"
6
+ span_term :field => "value2"
7
+ span_term :field => "value3"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ span_not do
4
+ include { span_term :field => "value1" }
5
+ exclude { span_term :field => "value2" }
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ span_or do
4
+ clauses do
5
+ span_term :field => "value1"
6
+ span_term :field => "value2"
7
+ span_term :field => "value3"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ span_term :user => "kimchy"
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ term "user", :value => "kimchy", :boost => 2.0
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ Eson::Search::BaseQuery.new(:term_boost => 2.0, :term => "kimchy") do
2
+ query do
3
+ term "user", :value => param(:term), :boost => param(:term_boost)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ terms({:tags => ['blue', 'pill'], :minimum_match => 2})
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ text :type => :phrase_prefix, :message => "this is a text"
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ top_children :blog_tag, :score => "max" do
4
+ query { term :tag => "something" }
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ wildcard "user", :value => "kim*y", :boost => 2.0
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ Eson::Search::BaseQuery.new do
2
+ query do
3
+ wildcard "user" => "kim*y"
4
+ end
5
+ end
@@ -0,0 +1,44 @@
1
+ module Eson
2
+ module QueryPlugin
3
+ def query
4
+ if block_given?
5
+ @query ||= Eson::Search::BaseQuery.new
6
+ @query.instance_exec(@query, &Proc.new)
7
+ end
8
+
9
+ @query
10
+ end
11
+
12
+ def call(*args)
13
+ if query.respond_to?(:to_query_hash)
14
+ self.params = query.to_query_hash
15
+ end
16
+
17
+ super(*args)
18
+ end
19
+
20
+ def method_missing(sym, *args, &block)
21
+ if query.query.respond_to?(sym)
22
+ query.query.send(sym, *args, &block)
23
+ else
24
+ super
25
+ end
26
+ end
27
+
28
+ def self.plugin_for(protocol)
29
+ [protocol::Search,
30
+ protocol::Count,
31
+ protocol::DeleteByQuery,
32
+ protocol::Percolate]
33
+ end
34
+
35
+ def handle_block(&block)
36
+ # in ruby 1.8.7, `lambda {}.arity == -1`
37
+ if (block.arity == 0) || (block.arity == -1)
38
+ query(&block)
39
+ else
40
+ super
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,27 @@
1
+ module Eson
2
+ module Search
3
+ class And
4
+ include Filters
5
+ include FilterMethods
6
+ include Filter
7
+
8
+ ##
9
+ # @macro and
10
+ # @yield the block describing all subfilters
11
+ # Generates a `$1` filter.
12
+ # {include:file:eson-dsl/examples/filters/$1.rb}
13
+ short_name 'and'
14
+
15
+ attr_accessor :options
16
+
17
+ def initialize(options = {})
18
+ self.options = options
19
+ end
20
+
21
+ def to_query_hash
22
+ { name => filters.to_query_hash }
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,39 @@
1
+ module Eson
2
+ module Search
3
+ class BaseQuery
4
+ include QueryGroup
5
+ include Facets
6
+ include Parametrized
7
+
8
+ def initialize(args = {})
9
+ self.args = args
10
+ instance_exec(self, &Proc.new) if block_given?
11
+ end
12
+
13
+ def to_query_hash
14
+ if (!queries || queries.empty?)
15
+ hash = {:query => {:match_all => {}}}
16
+ else
17
+ hash = {:query => queries.to_query_hash }
18
+ end
19
+
20
+ if filters && !filters.empty?
21
+ hash = {
22
+ :query => {
23
+ :filtered => {
24
+ :query => hash[:query],
25
+ :filter => filters.to_query_hash
26
+ }
27
+ }
28
+ }
29
+ end
30
+
31
+ if facets.length > 0
32
+ hash[:facets] = facets.to_query_hash
33
+ end
34
+
35
+ hash
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,51 @@
1
+ module Eson
2
+ module Search
3
+ class Bool
4
+ include Filter
5
+ include Query
6
+
7
+ # @macro bool
8
+ # @yield the block containing all subqueries
9
+ # Generates a `$1` filter or query, depending on context.
10
+ # {include:file:eson-dsl/examples/filters/$1.rb}
11
+ # {include:file:eson-dsl/examples/queries/$1.rb}
12
+ short_name :bool
13
+
14
+ attr_accessor :options, :conditions
15
+
16
+ def initialize(options = {})
17
+ self.options = options
18
+ end
19
+
20
+ def conditions
21
+ @conditions ||= {}
22
+ end
23
+
24
+ def must(&block)
25
+ q = (conditions[:must] ||= SubQuery.new(args))
26
+ q.send(context, &block)
27
+ end
28
+
29
+ def must_not(&block)
30
+ q = (conditions[:must_not] ||= SubQuery.new(args))
31
+ q.send(context, &block)
32
+ end
33
+
34
+ def should(&block)
35
+ q = (conditions[:should] ||= SubQuery.new(args))
36
+ q.send(context, &block)
37
+ end
38
+
39
+ def to_query_hash
40
+ result = {}
41
+
42
+ conditions.each do |k,v|
43
+ result[k] = v.to_query_hash
44
+ end
45
+
46
+ {name => result.merge(options)}
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,45 @@
1
+ module Eson
2
+ module Search
3
+ class Boosting
4
+ include Query
5
+
6
+ ##
7
+ # @macro eson.query
8
+ # @yield the block describing all subqueries
9
+ # Generates a `$1` query.
10
+ # {include:file:eson-dsl/examples/queries/$1.rb}
11
+ short_name :boosting
12
+
13
+ attr_accessor :options, :conditions
14
+
15
+ def initialize(options = {})
16
+ self.options = options
17
+ end
18
+
19
+ def boosts
20
+ @boosts ||= {}
21
+ end
22
+
23
+ def positive(&block)
24
+ q = (boosts[:positive] ||= SubQuery.new(args))
25
+ q.query(&block)
26
+ end
27
+
28
+ def negative(&block)
29
+ q = (boosts[:negative] ||= SubQuery.new(args))
30
+ q.query(&block)
31
+ end
32
+
33
+ def to_query_hash
34
+ result = {}
35
+
36
+ boosts.each do |k,v|
37
+ result[k] = v.to_query_hash
38
+ end
39
+
40
+ {name => result.merge(options)}
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,21 @@
1
+ module Eson
2
+ module Search
3
+ class ConstantScore
4
+
5
+ include Filters
6
+ include Queries
7
+
8
+ include Query
9
+
10
+ # @macro eson.query
11
+ short_name :constant_score
12
+
13
+ attr_accessor :options
14
+
15
+ def initialize(options = {})
16
+ self.options = options
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module Eson
2
+ module Search
3
+ class CustomScore
4
+
5
+ include Queries
6
+ include Query
7
+
8
+ # @macro eson.query
9
+ short_name :custom_score
10
+
11
+ attr_accessor :options
12
+
13
+ def initialize(options = {})
14
+ self.options = options
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ module Eson
2
+ module Search
3
+ class DateHistogram < Histogram
4
+
5
+ ##
6
+ # @macro eson.facet
7
+ # Generates a `$1` facet.
8
+ # {include:file:eson-dsl/examples/facets/$1.rb}
9
+ short_name :date_histogram
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ module Eson
2
+ module Search
3
+ class DisMax
4
+ include Query
5
+ include Queries
6
+
7
+ # @macro eson.query
8
+ short_name :dis_max
9
+
10
+ attr_accessor :options
11
+
12
+ def initialize(options = {})
13
+ self.options = options
14
+ end
15
+
16
+ def to_query_hash
17
+ {name => {:queries => queries.to_query_hash}.merge(options) }
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ module Eson
2
+ module Search
3
+ class Exists < FieldBased
4
+ include Filter
5
+
6
+ # @macro eson.filter
7
+ short_name :exists
8
+
9
+ def to_query_hash
10
+ if field
11
+ {name => field.to_query_hash}
12
+ else
13
+ {name => options}
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,39 @@
1
+ module Eson
2
+ module Search
3
+ module Facet
4
+ module ClassMethods
5
+ def short_name(name)
6
+ define_method :name do
7
+ name
8
+ end
9
+ Facets.register name, self
10
+
11
+ super if defined? super
12
+ end
13
+ end
14
+
15
+ def self.included(base)
16
+ base.class_eval do
17
+ extend ClassMethods
18
+ end
19
+ end
20
+
21
+ attr_accessor :args
22
+
23
+ def param(name)
24
+ args[name] || (raise "Parameter #{name} not given")
25
+ end
26
+
27
+ def scope(query, name)
28
+ raise "Cannot scope unless Query is a NestedQuery" unless Nested === query
29
+ query.options[:_scope] = name
30
+ self.options[:scope] = name
31
+ end
32
+
33
+ def method_missing(name, arg)
34
+ warn("#{name} called as a facet option")
35
+ self.options[name] = arg
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,37 @@
1
+ module Eson
2
+ module Search
3
+ module Facets
4
+ class FacetArray < Array
5
+ include Parametrized
6
+
7
+ def initialize(args)
8
+ self.args = args
9
+ instance_exec(self, &Proc.new) if block_given?
10
+ end
11
+
12
+ def to_query_hash
13
+ h = {}
14
+ self.each do |k,v|
15
+ h[k] = v.to_query_hash
16
+ end
17
+ h
18
+ end
19
+ end
20
+
21
+ def self.register(name, klass)
22
+ FacetArray.__send__(:define_method, name) do |facet_name, *args, &block|
23
+ o = klass.new(*args)
24
+ o.args = self.args
25
+ o.instance_exec(o, &block) if block
26
+ self << [facet_name, o]
27
+ o
28
+ end
29
+ end
30
+
31
+ def facets(&block)
32
+ @facets ||= FacetArray.new(args, &block)
33
+ end
34
+ alias :facet :facets
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,16 @@
1
+ module Eson
2
+ module Search
3
+ class Field
4
+ include Query
5
+
6
+ # @macro eson.query
7
+ short_name :field
8
+
9
+ attr_accessor :options
10
+
11
+ def initialize(options = {})
12
+ self.options = options
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,24 @@
1
+ module Eson
2
+ module Search
3
+ class FieldBased
4
+ attr_accessor :field
5
+ attr_accessor :options
6
+
7
+ def initialize(*args)
8
+ if args.length == 1
9
+ self.options = args.first
10
+ else
11
+ self.field = QueryField.new(*args)
12
+ end
13
+ end
14
+
15
+ def to_query_hash
16
+ if field
17
+ {name => field.to_query_hash}
18
+ else
19
+ {name => options}
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end