qiita-elasticsearch 0.4.0 → 0.5.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: 133b6b66d4231ea9d97e516812cc58b232981319
4
- data.tar.gz: b70d9f047d78e461e4cd81a076e5f09418982682
3
+ metadata.gz: 2ac89f9676b05d247337d139e417cb55d449152c
4
+ data.tar.gz: 44965231890460369545280221bedb008090743a
5
5
  SHA512:
6
- metadata.gz: 3d9776c15e61239299ec17682c62930e2fddade09934cccf08f236a8e85f38bb8788fc34703323a4e49d66094bc19c494a4b8e7cd6c3a567bdebab0a5b564e68
7
- data.tar.gz: 93d80c35c9135c8f3cb0837731fccd55b60cca6a912e9a36e1f641f71984b7f815b1d945c2a9836295fad9389ecec433566a5c457907759f0157c027caeb7b7d
6
+ metadata.gz: 0b507ea1cffce78984dd9e59a0d22b61727d1331a602f094b6731fe8784810495c3e65d09ffde4fce3c41dd9f747ed13087af9f400eefb677f8e8a8212eee030
7
+ data.tar.gz: 02286a98b45cfaca0f8bd6570d39faf5d3f21f68ca8b5cffa27a1430f00d7ec857ff25cf90032a68da59e6f48adc7c4a1285afa7505dd19e6127ae9b3c8d3119
data/.rubocop.yml CHANGED
@@ -22,6 +22,9 @@ Metrics/ParameterLists:
22
22
  Metrics/PerceivedComplexity:
23
23
  Enabled: false
24
24
 
25
+ Style/CaseEquality:
26
+ Enabled: false
27
+
25
28
  Style/Documentation:
26
29
  Enabled: false
27
30
 
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 0.5.0
2
+ - Change `QueryBuilder#build` to return `Query` object
3
+
1
4
  ## 0.4.0
2
5
  - Change range fields to use integer
3
6
  - Support date fields
@@ -1,7 +1,6 @@
1
1
  require "active_support/core_ext/date"
2
2
  require "active_support/core_ext/integer"
3
3
  require "qiita/elasticsearch/concerns/range_operand_includable"
4
- require "qiita/elasticsearch/errors"
5
4
  require "qiita/elasticsearch/token"
6
5
 
7
6
  module Qiita
@@ -53,16 +52,12 @@ module Qiita
53
52
  }
54
53
  end
55
54
  else
56
- fail InvalidQuery
55
+ Nodes::NullNode.new.to_hash
57
56
  end
58
57
  end
59
58
 
60
59
  private
61
60
 
62
- def date_match
63
- @date_match ||= DATE_PATTERN.match(range_query || @term)
64
- end
65
-
66
61
  # @return [Date]
67
62
  def beginning_of_range
68
63
  @beginning_of_range ||=
@@ -76,6 +71,10 @@ module Qiita
76
71
  end
77
72
  end
78
73
 
74
+ def date_match
75
+ @date_match ||= DATE_PATTERN.match(range_query || @term)
76
+ end
77
+
79
78
  # @return [Date]
80
79
  def end_of_range
81
80
  @end_of_range ||=
@@ -88,6 +87,11 @@ module Qiita
88
87
  beginning_of_range + 1.year
89
88
  end
90
89
  end
90
+
91
+ # @note Override
92
+ def has_invalid_term?
93
+ !!date_match
94
+ end
91
95
  end
92
96
  end
93
97
  end
@@ -1,5 +1,4 @@
1
1
  require "qiita/elasticsearch/concerns/range_operand_includable"
2
- require "qiita/elasticsearch/errors"
3
2
  require "qiita/elasticsearch/token"
4
3
 
5
4
  module Qiita
@@ -12,7 +11,7 @@ module Qiita
12
11
  # @return [Hash]
13
12
  # @raise [InvalidQuery]
14
13
  def to_hash
15
- if range_parameter && INT_PATTERN =~ range_query
14
+ if range_parameter && has_valid_range_query?
16
15
  {
17
16
  "range" => {
18
17
  @field_name => {
@@ -20,16 +19,39 @@ module Qiita
20
19
  },
21
20
  },
22
21
  }
23
- elsif INT_PATTERN =~ @term
22
+ elsif has_valid_int_term?
24
23
  {
25
24
  "term" => {
26
25
  @field_name => @term.to_i,
27
26
  },
28
27
  }
29
28
  else
30
- fail InvalidQuery
29
+ Nodes::NullNode.new.to_hash
31
30
  end
32
31
  end
32
+
33
+ private
34
+
35
+ def has_invalid_range_query?
36
+ has_range_query? && !has_valid_range_query?
37
+ end
38
+
39
+ # @note Override
40
+ def has_invalid_term?
41
+ range_parameter && has_invalid_range_query? || !has_valid_int_term?
42
+ end
43
+
44
+ def has_range_query?
45
+ !range_query.nil?
46
+ end
47
+
48
+ def has_valid_int_term?
49
+ INT_PATTERN === @term
50
+ end
51
+
52
+ def has_valid_range_query?
53
+ INT_PATTERN === range_query
54
+ end
33
55
  end
34
56
  end
35
57
  end
@@ -31,7 +31,7 @@ module Qiita
31
31
 
32
32
  # @return [Array<Array<Qiita::Elasticsearch::Token>>]
33
33
  def tokens_grouped_by_or_token
34
- @tokens_grouped_by_or_token ||= @tokens.each_with_object([[]]) do |token, groups|
34
+ @tokens_grouped_by_or_token ||= @tokens.reject(&:ignorable?).each_with_object([[]]) do |token, groups|
35
35
  if token.or?
36
36
  groups << []
37
37
  else
@@ -0,0 +1,96 @@
1
+ require "qiita/elasticsearch/nodes/null_node"
2
+ require "qiita/elasticsearch/nodes/or_separatable_node"
3
+ require "qiita/elasticsearch/tokenizer"
4
+
5
+ module Qiita
6
+ module Elasticsearch
7
+ class Query
8
+ # @param [Array<Qiita::Elasticsearch::Token>] tokens
9
+ # @param [Hash] query_builder_options For building new query from this query
10
+ def initialize(tokens, query_builder_options = nil)
11
+ @query_builder_options = query_builder_options
12
+ @tokens = tokens
13
+ end
14
+
15
+ # @param [String] field_name
16
+ # @param [String] term
17
+ # @return [Qiita::Elasticsearch::Query]
18
+ # @example query.append_field_token(field_name: "tag", term: "Ruby")
19
+ def append_field_token(field_name: nil, term: nil)
20
+ build_query([*@tokens, "#{field_name}:#{term}"].join(" "))
21
+ end
22
+
23
+ # @param [String] field_name
24
+ # @param [String] term
25
+ # @return [Qiita::Elasticsearch::Query]
26
+ # @example query.delete_field_token(field_name: "tag", term: "Ruby")
27
+ def delete_field_token(field_name: nil, term: nil)
28
+ build_query(
29
+ @tokens.reject do |token|
30
+ token.field_name == field_name && token.term == term
31
+ end.join(" ")
32
+ )
33
+ end
34
+
35
+ # @param [String] field_name
36
+ # @param [String] term
37
+ # @example query.has_field_token?(field_name: "tag", term: "Ruby")
38
+ def has_field_token?(field_name: nil, term: nil)
39
+ @tokens.any? do |token|
40
+ token.field_name == field_name && token.term == term
41
+ end
42
+ end
43
+
44
+ # @return [Hash]
45
+ # @example query.to_hash
46
+ def to_hash
47
+ if has_empty_tokens?
48
+ Nodes::NullNode.new.to_hash
49
+ else
50
+ Nodes::OrSeparatableNode.new(@tokens).to_hash
51
+ end
52
+ end
53
+
54
+ # @return [String] query string generated from its tokens
55
+ def to_s
56
+ @tokens.join(" ")
57
+ end
58
+
59
+ # @param [String] field_name
60
+ # @param [String] term
61
+ # @return [Qiita::Elasticsearch::Query]
62
+ # @example query.update_field_token(field_name: "tag", term: "Ruby")
63
+ def update_field_token(field_name: nil, term: nil)
64
+ build_query(
65
+ @tokens.reject do |token|
66
+ token.field_name == field_name
67
+ end.map(&:to_s).push("#{field_name}:#{term}").join(" ")
68
+ )
69
+ end
70
+
71
+ private
72
+
73
+ # Build a new query from query string
74
+ # @param [String] query_string
75
+ # @return [Qiita::Elasticsearch::Query]
76
+ # @example build_query("test tag:Ruby")
77
+ def build_query(query_string)
78
+ query_builder.build(query_string)
79
+ end
80
+
81
+ def has_empty_tokens?
82
+ @tokens.size.zero?
83
+ end
84
+
85
+ # @return [Qiita::Elasticsearch::QueryBuilder]
86
+ def query_builder
87
+ QueryBuilder.new(query_builder_options)
88
+ end
89
+
90
+ # @return [Hash]
91
+ def query_builder_options
92
+ @query_builder_options || {}
93
+ end
94
+ end
95
+ end
96
+ end
@@ -1,7 +1,6 @@
1
- require "qiita/elasticsearch/errors"
2
1
  require "qiita/elasticsearch/nodes/null_node"
3
2
  require "qiita/elasticsearch/nodes/or_separatable_node"
4
- require "qiita/elasticsearch/tokenizer"
3
+ require "qiita/elasticsearch/query"
5
4
 
6
5
  module Qiita
7
6
  module Elasticsearch
@@ -24,16 +23,17 @@ module Qiita
24
23
  end
25
24
 
26
25
  # @param [String] query_string Raw query string
27
- # @return [Hash]
26
+ # @return [Qiita::Elasticsearch::Query]
28
27
  def build(query_string)
29
- tokens = tokenizer.tokenize(query_string)
30
- if tokens.size.zero?
31
- Nodes::NullNode.new.to_hash
32
- else
33
- Nodes::OrSeparatableNode.new(tokens).to_hash
34
- end
35
- rescue Error
36
- Nodes::NullNode.new.to_hash
28
+ Query.new(
29
+ tokenizer.tokenize(query_string),
30
+ downcased_fields: @downcased_fields,
31
+ filterable_fields: @filterable_fields,
32
+ hierarchal_fields: @hierarchal_fields,
33
+ int_fields: @int_fields,
34
+ matchable_fields: @matchable_fields,
35
+ time_zone: @time_zone,
36
+ )
37
37
  end
38
38
 
39
39
  private
@@ -3,11 +3,16 @@ module Qiita
3
3
  class Token
4
4
  attr_reader :field_name, :term
5
5
 
6
- # @param [true, false] downcased
7
- def initialize(downcased: nil, field_name: nil, minus: nil, quoted: nil, term: nil, token_string: nil)
6
+ # @param [true, false] downcased True if given term must be downcased on query representation
7
+ # @param [String, nil] field_name Field name part
8
+ # @param [true, fales] negative True if this term represents negative token (e.g. "-Perl")
9
+ # @param [true, false] quoted Given term is quoted or note
10
+ # @param [String] term Term part
11
+ # @param [String] token_string Original entire string
12
+ def initialize(downcased: nil, field_name: nil, negative: nil, quoted: nil, term: nil, token_string: nil)
8
13
  @downcased = downcased
9
14
  @field_name = field_name
10
- @minus = minus
15
+ @negative = negative
11
16
  @quoted = quoted
12
17
  @term = term
13
18
  @token_string = token_string
@@ -22,14 +27,15 @@ module Qiita
22
27
  @downcased_term ||= term.downcase
23
28
  end
24
29
 
25
- def to_hash
26
- fail NotImplementedError
27
- end
28
-
29
30
  def filter?
30
31
  !field_name.nil? || negative?
31
32
  end
32
33
 
34
+ # @return [true, false] True if this token is ignorable on building query (e.g. "-stocked:foo")
35
+ def ignorable?
36
+ negative? && !field_name.nil? && has_invalid_term?
37
+ end
38
+
33
39
  def must?
34
40
  !field_name.nil? && positive?
35
41
  end
@@ -43,7 +49,7 @@ module Qiita
43
49
  # ^^^^^
44
50
  # This
45
51
  def negative?
46
- !positive?
52
+ !!@negative
47
53
  end
48
54
 
49
55
  # @return [true, false] True if this token is for OR filter
@@ -56,7 +62,7 @@ module Qiita
56
62
 
57
63
  # @return [true, false] Opposite of #negative?
58
64
  def positive?
59
- @minus.nil?
65
+ !negative?
60
66
  end
61
67
 
62
68
  # @return [String] Downcased or not-downcased term
@@ -75,6 +81,25 @@ module Qiita
75
81
  def quoted?
76
82
  !!@quoted
77
83
  end
84
+
85
+ # @note Override me
86
+ def to_hash
87
+ fail NotImplementedError
88
+ end
89
+
90
+ # @note Override
91
+ # @return [String]
92
+ def to_s
93
+ @token_string.to_s
94
+ end
95
+
96
+ private
97
+
98
+ # @note Override me if needed
99
+ # @return [true, false] True if its term is invalid value
100
+ def has_invalid_term?
101
+ false
102
+ end
78
103
  end
79
104
  end
80
105
  end
@@ -54,7 +54,7 @@ module Qiita
54
54
  token = token_class(field_name).new(
55
55
  downcased: downcased_fields.include?(field_name),
56
56
  field_name: field_name,
57
- minus: minus,
57
+ negative: !minus.nil?,
58
58
  quoted: !quoted_term.nil?,
59
59
  term: term,
60
60
  token_string: token_string,
@@ -1,5 +1,5 @@
1
1
  module Qiita
2
2
  module Elasticsearch
3
- VERSION = "0.4.0"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  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.4.0
4
+ version: 0.5.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-04-23 00:00:00.000000000 Z
11
+ date: 2015-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -113,7 +113,6 @@ files:
113
113
  - lib/qiita/elasticsearch.rb
114
114
  - lib/qiita/elasticsearch/concerns/range_operand_includable.rb
115
115
  - lib/qiita/elasticsearch/date_token.rb
116
- - lib/qiita/elasticsearch/errors.rb
117
116
  - lib/qiita/elasticsearch/filterable_token.rb
118
117
  - lib/qiita/elasticsearch/hierarchal_token.rb
119
118
  - lib/qiita/elasticsearch/int_token.rb
@@ -126,6 +125,7 @@ files:
126
125
  - lib/qiita/elasticsearch/nodes/or_separatable_node.rb
127
126
  - lib/qiita/elasticsearch/nodes/query_node.rb
128
127
  - lib/qiita/elasticsearch/nodes/term_node.rb
128
+ - lib/qiita/elasticsearch/query.rb
129
129
  - lib/qiita/elasticsearch/query_builder.rb
130
130
  - lib/qiita/elasticsearch/range_token.rb
131
131
  - lib/qiita/elasticsearch/token.rb
@@ -152,8 +152,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
152
152
  version: '0'
153
153
  requirements: []
154
154
  rubyforge_project:
155
- rubygems_version: 2.2.2
155
+ rubygems_version: 2.4.5
156
156
  signing_key:
157
157
  specification_version: 4
158
158
  summary: Elasticsearch client helper for Qiita.
159
159
  test_files: []
160
+ has_rdoc:
@@ -1,10 +0,0 @@
1
- module Qiita
2
- module Elasticsearch
3
- # @note Custom error class for rescuing from all Qiita::Elasticsearch errors.
4
- class Error < StandardError
5
- end
6
-
7
- class InvalidQuery < Error
8
- end
9
- end
10
- end