qiita-elasticsearch 0.14.3 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5f9fa6ee033eee2b5e4e95384bbfd34ba7e9311b
4
- data.tar.gz: 06355fdf4dbc5e734b1335d9b716a5dd93fe57cf
3
+ metadata.gz: d55e5e12468e89a3e9b902858d5bb4c50e70604c
4
+ data.tar.gz: 432915c14a639a533c206592df5f1df5ba5dfc9f
5
5
  SHA512:
6
- metadata.gz: 6b15d24f4500f5760c56181eccdc19fed7e60990acdca48e284028c15f6f29e39feb75ed9cc3cfb5f783e711a94e22f15d7c081beeed2638476ba5c9fa22ab92
7
- data.tar.gz: aff8bbea70b132a1e31426f0a9b83d3bc3c4dfc1698d4c37f8ed7a1462c17977998c34b3e9a134597c3b7912bf19e63810ccc207ada872c5859730e0861ce3dd
6
+ metadata.gz: bc55dc75f2de4fa3791796f11c43006975e6be87ed2c30d02dddd3eeb6ff63f3fd63419e231e3315c796df6488f516a63ad77f3ace5a908bdfae31c215b9d733
7
+ data.tar.gz: 5197b2b423fd8447914f3e4e14cd781eae6eb262bc719c1c736b7e70f6d6191ec294382567b52a4327f1e3cc5e7f591622f812721583056e70a9e2bcf8a5ac27
data/.gitignore CHANGED
@@ -5,5 +5,6 @@
5
5
  /coverage/
6
6
  /doc/
7
7
  /pkg/
8
+ /spec/examples.txt
8
9
  /spec/reports/
9
10
  /tmp/
data/README.md CHANGED
@@ -23,11 +23,11 @@ query_builder.build("a OR b")
23
23
  #=> {"bool"=>{"should"=>[{"match"=>{"_all"=>"a"}}, {"match"=>{"_all"=>"b"}}]}}
24
24
  ```
25
25
 
26
- ### matchable_fields
27
- Pass `:matchable_fields` option to tell matchable field names (default: `_all`).
26
+ ### default_fields
27
+ Pass `:default_fields` option to tell default (matchable) field names (default: `_all`).
28
28
 
29
29
  ```rb
30
- query_builder = Qiita::Elasticsearch::QueryBuilder.new(matchable_fields: ["body", "title"])
30
+ query_builder = Qiita::Elasticsearch::QueryBuilder.new(default_fields: ["body", "title"])
31
31
 
32
32
  query_builder.build("a")
33
33
  #=> {"multi_match"=>{"fields"=>["body", "title"], "query"=>"a"}}
@@ -5,7 +5,7 @@ module Qiita
5
5
  class MatchableToken < Token
6
6
  RELATIVE_BEST_FIELDS_QUERY_WEIGHT = 0.5
7
7
 
8
- attr_writer :matchable_fields
8
+ attr_writer :default_fields
9
9
 
10
10
  # @return [Hash]
11
11
  def to_hash
@@ -30,12 +30,22 @@ module Qiita
30
30
  {
31
31
  "multi_match" => {
32
32
  "boost" => boost,
33
- "fields" => @matchable_fields || ["_all"],
33
+ "fields" => matchable_fields,
34
34
  "query" => @term,
35
35
  "type" => type,
36
36
  },
37
37
  }
38
38
  end
39
+
40
+ def matchable_fields
41
+ if field_name
42
+ [field_name]
43
+ elsif @default_fields && !@default_fields.empty?
44
+ @default_fields
45
+ else
46
+ ["_all"]
47
+ end
48
+ end
39
49
  end
40
50
  end
41
51
  end
@@ -5,20 +5,22 @@ require "qiita/elasticsearch/query"
5
5
  module Qiita
6
6
  module Elasticsearch
7
7
  class QueryBuilder
8
+ # @param [Array<String>, nil] all_fields
8
9
  # @param [Array<String>, nil] date_fields
9
10
  # @param [Array<String>, nil] downcased_fields
10
11
  # @param [Array<String>, nil] filterable_fields
11
12
  # @param [Array<String>, nil] hierarchal_fields
12
13
  # @param [Array<String>, nil] int_fields
13
- # @param [Array<String>, nil] matchable_fields
14
+ # @param [Array<String>, nil] default_fields
14
15
  # @param [String, nil] time_zone
15
- def initialize(date_fields: nil, downcased_fields: nil, hierarchal_fields: nil, filterable_fields: nil, int_fields: nil, matchable_fields: nil, time_zone: nil)
16
+ def initialize(all_fields: nil, date_fields: nil, downcased_fields: nil, hierarchal_fields: nil, filterable_fields: nil, int_fields: nil, default_fields: nil, time_zone: nil)
17
+ @all_fields = all_fields
16
18
  @date_fields = date_fields
17
19
  @downcased_fields = downcased_fields
18
20
  @filterable_fields = filterable_fields
19
21
  @hierarchal_fields = hierarchal_fields
20
22
  @int_fields = int_fields
21
- @matchable_fields = matchable_fields
23
+ @default_fields = default_fields
22
24
  @time_zone = time_zone
23
25
  end
24
26
 
@@ -31,7 +33,7 @@ module Qiita
31
33
  filterable_fields: @filterable_fields,
32
34
  hierarchal_fields: @hierarchal_fields,
33
35
  int_fields: @int_fields,
34
- matchable_fields: @matchable_fields,
36
+ default_fields: @default_fields,
35
37
  time_zone: @time_zone,
36
38
  )
37
39
  end
@@ -40,12 +42,13 @@ module Qiita
40
42
 
41
43
  def tokenizer
42
44
  @tokenizer ||= Tokenizer.new(
45
+ all_fields: @all_fields,
43
46
  date_fields: @date_fields,
44
47
  downcased_fields: @downcased_fields,
45
48
  filterable_fields: @filterable_fields,
46
49
  hierarchal_fields: @hierarchal_fields,
47
50
  int_fields: @int_fields,
48
- matchable_fields: @matchable_fields,
51
+ default_fields: @default_fields,
49
52
  time_zone: @time_zone,
50
53
  )
51
54
  end
@@ -15,15 +15,17 @@ module Qiita
15
15
 
16
16
  # @param [true, false] downcased True if given term must be downcased on query representation
17
17
  # @param [String, nil] field_name Field name part
18
- # @param [true, fales] negative True if this term represents negative token (e.g. "-Perl")
19
- # @param [true, false] quoted Given term is quoted or note
18
+ # @param [true, false] negative True if this term represents negative token (e.g. "-Perl")
19
+ # @param [true, false] quoted Given term is quoted or not
20
+ # @param [true, false] filter True if this term should be used as filter
20
21
  # @param [String] term Term part
21
22
  # @param [String] token_string Original entire string
22
- def initialize(downcased: nil, field_name: nil, negative: nil, quoted: nil, term: nil, token_string: nil)
23
+ def initialize(downcased: nil, field_name: nil, negative: nil, quoted: nil, filter: nil, term: nil, token_string: nil)
23
24
  @downcased = downcased
24
25
  @field_name = field_name
25
26
  @negative = negative
26
27
  @quoted = quoted
28
+ @filter = filter
27
29
  @term = term
28
30
  @token_string = token_string
29
31
  end
@@ -38,7 +40,7 @@ module Qiita
38
40
  end
39
41
 
40
42
  def filter?
41
- !field_name.nil? || negative?
43
+ !!@filter || negative?
42
44
  end
43
45
 
44
46
  # @return [true, false] True if this token is for query
@@ -12,6 +12,7 @@ module Qiita
12
12
  DEFAULT_FILTERABLE_FIELDS = []
13
13
  DEFAULT_HIERARCHAL_FIELDS = []
14
14
  DEFAULT_INT_FIELDS = []
15
+ DEFAULT_DEFAULT_FIELDS = []
15
16
  EXTRA_DATE_FIELDS = %w(created updated)
16
17
  EXTRA_FILTERABLE_FIELDS = %w(created is sort updated)
17
18
 
@@ -27,20 +28,22 @@ module Qiita
27
28
  )
28
29
  /x
29
30
 
31
+ # @param [Array<String>, nil] all_fields
30
32
  # @param [Array<String>, nil] date_fields
31
33
  # @param [Array<String>, nil] downcased_fields
32
34
  # @param [Array<String>, nil] filterable_fields
33
35
  # @param [Array<String>, nil] hierarchal_fields
34
36
  # @param [Array<String>, nil] int_fields
35
- # @param [Array<String>, nil] matchable_fields
37
+ # @param [Array<String>, nil] default_fields
36
38
  # @param [String, nil] time_zone
37
- def initialize(date_fields: nil, downcased_fields: nil, filterable_fields: nil, hierarchal_fields: nil, int_fields: nil, matchable_fields: nil, time_zone: nil)
38
- @date_fields = date_fields
39
- @downcased_fields = downcased_fields
40
- @filterable_fields = filterable_fields
41
- @hierarchal_fields = hierarchal_fields
42
- @int_fields = int_fields
43
- @matchable_fields = matchable_fields
39
+ def initialize(all_fields: nil, date_fields: nil, downcased_fields: nil, filterable_fields: nil, hierarchal_fields: nil, int_fields: nil, default_fields: nil, time_zone: nil)
40
+ @date_fields = (date_fields || DEFAULT_DATE_FIELDS) | EXTRA_DATE_FIELDS
41
+ @downcased_fields = downcased_fields || DEFAULT_DOWNCASED_FIELDS
42
+ @filterable_fields = (filterable_fields || DEFAULT_FILTERABLE_FIELDS) | EXTRA_FILTERABLE_FIELDS
43
+ @hierarchal_fields = hierarchal_fields || DEFAULT_HIERARCHAL_FIELDS
44
+ @int_fields = int_fields || DEFAULT_INT_FIELDS
45
+ @default_fields = default_fields || DEFAULT_DEFAULT_FIELDS
46
+ @all_fields = aggregate_all_fields(all_fields)
44
47
  @time_zone = time_zone
45
48
  end
46
49
 
@@ -49,19 +52,20 @@ module Qiita
49
52
  def tokenize(query_string)
50
53
  query_string.scan(TOKEN_PATTERN).map do |token_string, minus, field_name, quoted_term, term|
51
54
  term ||= quoted_term
52
- if !field_name.nil? && !filterable_fields.include?(field_name)
55
+ if !field_name.nil? && !@all_fields.include?(field_name)
53
56
  term = "#{field_name}:#{term}"
54
57
  field_name = nil
55
58
  end
56
59
  token = token_class(field_name).new(
57
- downcased: downcased_fields.include?(field_name),
60
+ downcased: @downcased_fields.include?(field_name),
58
61
  field_name: field_name,
59
62
  negative: !minus.nil?,
60
63
  quoted: !quoted_term.nil?,
64
+ filter: @filterable_fields.include?(field_name),
61
65
  term: term,
62
66
  token_string: token_string,
63
67
  )
64
- token.matchable_fields = @matchable_fields if token.is_a?(MatchableToken)
68
+ token.default_fields = @default_fields if token.is_a?(MatchableToken)
65
69
  token.time_zone = @time_zone if token.is_a?(DateToken)
66
70
  token
67
71
  end
@@ -69,35 +73,29 @@ module Qiita
69
73
 
70
74
  private
71
75
 
72
- def date_fields
73
- (@date_fields || DEFAULT_DATE_FIELDS) | EXTRA_DATE_FIELDS
74
- end
75
-
76
- def downcased_fields
77
- @downcased_fields || DEFAULT_DOWNCASED_FIELDS
78
- end
79
-
80
- def filterable_fields
81
- (@filterable_fields || DEFAULT_FILTERABLE_FIELDS) | EXTRA_FILTERABLE_FIELDS
82
- end
83
-
84
- def hierarchal_fields
85
- @hierarchal_fields || DEFAULT_HIERARCHAL_FIELDS
86
- end
76
+ def aggregate_all_fields(base)
77
+ fields = [
78
+ base,
79
+ @date_fields,
80
+ @downcased_fields,
81
+ @filterable_fields,
82
+ @hierarchal_fields,
83
+ @int_fields,
84
+ @default_fields
85
+ ].flatten.compact
87
86
 
88
- def int_fields
89
- @int_fields || DEFAULT_INT_FIELDS
87
+ fields.map { |field| field.sub(/\^\d+\z/, "") }.uniq
90
88
  end
91
89
 
92
90
  def token_class(field_name)
93
91
  case
94
- when date_fields.include?(field_name)
92
+ when @date_fields.include?(field_name)
95
93
  DateToken
96
- when int_fields.include?(field_name)
94
+ when @int_fields.include?(field_name)
97
95
  IntToken
98
- when hierarchal_fields.include?(field_name)
96
+ when @hierarchal_fields.include?(field_name)
99
97
  HierarchalToken
100
- when filterable_fields.include?(field_name)
98
+ when @filterable_fields.include?(field_name)
101
99
  FilterableToken
102
100
  else
103
101
  MatchableToken
@@ -1,5 +1,5 @@
1
1
  module Qiita
2
2
  module Elasticsearch
3
- VERSION = "0.14.3"
3
+ VERSION = "0.15.0"
4
4
  end
5
5
  end
@@ -18,6 +18,6 @@ Gem::Specification.new do |spec|
18
18
  spec.add_development_dependency "bundler", ">= 1.7"
19
19
  spec.add_development_dependency "codeclimate-test-reporter"
20
20
  spec.add_development_dependency "rake", "~> 10.0"
21
- spec.add_development_dependency "rspec", "3.2.0"
21
+ spec.add_development_dependency "rspec", "~> 3.3"
22
22
  spec.add_development_dependency "rubocop", "0.29.1"
23
23
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qiita-elasticsearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.3
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-29 00:00:00.000000000 Z
11
+ date: 2015-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -70,16 +70,16 @@ dependencies:
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '='
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 3.2.0
75
+ version: '3.3'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '='
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 3.2.0
82
+ version: '3.3'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rubocop
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -153,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
153
  version: '0'
154
154
  requirements: []
155
155
  rubyforge_project:
156
- rubygems_version: 2.4.5
156
+ rubygems_version: 2.4.5.1
157
157
  signing_key:
158
158
  specification_version: 4
159
159
  summary: Elasticsearch client helper for Qiita.