es-query-builder 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/es-query-builder/parser.rb +19 -14
- data/lib/es-query-builder/version.rb +1 -1
- data/spec/es_query_builder_spec.rb +69 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f83ec59a43ec2595976f103e18b8a2135a931b41
|
4
|
+
data.tar.gz: bf950eec7d0a7b3a984948b12f31fc6b06074b1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 929a33a7427b0392f686bae8aca50bf2a23877b6982c30775047d109336a271c02355985f35bfe037787cff618815eead53f2955e69645d2ee43c54cca0a8e77
|
7
|
+
data.tar.gz: 68b1aa1017822dfa80bb1c60a6829d68393c348efefd9ed6d5c1f625f0ac3ab0ffe9e3e72f7c3c56d221678d4060b243e75dcc87cc3aa1064e8b86c542f0c84f
|
@@ -136,14 +136,13 @@ class EsQueryBuilder
|
|
136
136
|
# Returns a Hash represents a filter hash.
|
137
137
|
def build_filter_hash(filter_tokens)
|
138
138
|
return {} if filter_tokens.empty?
|
139
|
-
must,
|
140
|
-
if must.size == 1 &&
|
139
|
+
must, must_not = create_bool_filters(filter_tokens)
|
140
|
+
if must.size == 1 && must_not.empty?
|
141
141
|
# Term filter is cached by default.
|
142
142
|
must.first
|
143
143
|
else
|
144
144
|
bool = {}
|
145
145
|
bool[:must] = must if must.size > 0
|
146
|
-
bool[:should] = should if should.size > 0
|
147
146
|
bool[:must_not] = must_not if must_not.size > 0
|
148
147
|
# Bool filter is not cached by default.
|
149
148
|
{ bool: bool.merge(_cache: true) }
|
@@ -232,13 +231,9 @@ class EsQueryBuilder
|
|
232
231
|
#
|
233
232
|
# Examples
|
234
233
|
#
|
235
|
-
# # When 'tag:"foo bar"'
|
236
|
-
# create_bool_filters([...])
|
237
|
-
# # => [[{ term: { tag: 'foo' }}, { term: { tag: 'bar' }], [], []]
|
238
|
-
#
|
239
234
|
# # When 'tag:foo'
|
240
235
|
# create_bool_filters([...])
|
241
|
-
# # => [[
|
236
|
+
# # => [[ { bool: { should: [{ term: { tag: 'foo' } }, { prefix: { tag: 'foo/' } }] } }], []]
|
242
237
|
#
|
243
238
|
# # When '-tag:foo'
|
244
239
|
# create_bool_filters([...])
|
@@ -246,21 +241,31 @@ class EsQueryBuilder
|
|
246
241
|
#
|
247
242
|
# Returns an Array consists of must, should and must_not filters arrays.
|
248
243
|
def create_bool_filters(filter_tokens)
|
249
|
-
must,
|
244
|
+
must, must_not = [], []
|
250
245
|
filter_tokens.each do |token|
|
251
246
|
token.term.split.each do |term|
|
252
247
|
if @hierarchy_fields.include?(token.field)
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
248
|
+
if token.minus?
|
249
|
+
must_not << { prefix: { token.field => term.downcase + '/' } }
|
250
|
+
must_not << { term: { token.field => term.downcase } }
|
251
|
+
else
|
252
|
+
must << {
|
253
|
+
bool: {
|
254
|
+
should: [
|
255
|
+
{ prefix: { token.field => term.downcase + '/' } },
|
256
|
+
# Exactly matches to the tag.
|
257
|
+
{ term: { token.field => term.downcase } },
|
258
|
+
]
|
259
|
+
}
|
260
|
+
}
|
261
|
+
end
|
257
262
|
else
|
258
263
|
cond = token.minus? ? must_not : must
|
259
264
|
cond << { term: { token.field => term.downcase } }
|
260
265
|
end
|
261
266
|
end
|
262
267
|
end
|
263
|
-
[must,
|
268
|
+
[must, must_not]
|
264
269
|
end
|
265
270
|
end
|
266
271
|
end
|
@@ -536,13 +536,80 @@ describe EsQueryBuilder do
|
|
536
536
|
should: [
|
537
537
|
{ prefix: { hierarchy_field => term + '/' } },
|
538
538
|
{ term: { hierarchy_field => term } }
|
539
|
-
]
|
540
|
-
_cache: true
|
539
|
+
]
|
541
540
|
}
|
542
541
|
}
|
543
542
|
}
|
544
543
|
)
|
545
544
|
end
|
545
|
+
|
546
|
+
context 'and the query starts with a minus char' do
|
547
|
+
let(:query_string) do
|
548
|
+
"-#{hierarchy_field}:#{term}"
|
549
|
+
end
|
550
|
+
|
551
|
+
it 'returns must_not filter' do
|
552
|
+
should eq(
|
553
|
+
filtered: {
|
554
|
+
query: {
|
555
|
+
match_all: {},
|
556
|
+
},
|
557
|
+
filter: {
|
558
|
+
bool: {
|
559
|
+
must_not: [
|
560
|
+
{ prefix: { hierarchy_field => term + '/' } },
|
561
|
+
{ term: { hierarchy_field => term } }
|
562
|
+
],
|
563
|
+
_cache: true
|
564
|
+
}
|
565
|
+
}
|
566
|
+
}
|
567
|
+
)
|
568
|
+
end
|
569
|
+
end
|
570
|
+
|
571
|
+
context 'and there are multiple filtered query terms' do
|
572
|
+
let(:query_string) do
|
573
|
+
"#{hierarchy_field}:#{term} #{hierarchy_field}:#{term2}"
|
574
|
+
end
|
575
|
+
|
576
|
+
let(:term2) do
|
577
|
+
'world'
|
578
|
+
end
|
579
|
+
|
580
|
+
it 'returns both slash-ending-prefix and term filters' do
|
581
|
+
should eq(
|
582
|
+
filtered: {
|
583
|
+
query: {
|
584
|
+
match_all: {},
|
585
|
+
},
|
586
|
+
filter: {
|
587
|
+
bool: {
|
588
|
+
must: [
|
589
|
+
{
|
590
|
+
bool: {
|
591
|
+
should: [
|
592
|
+
{ prefix: { hierarchy_field => term + '/' } },
|
593
|
+
{ term: { hierarchy_field => term } }
|
594
|
+
]
|
595
|
+
}
|
596
|
+
},
|
597
|
+
{
|
598
|
+
bool: {
|
599
|
+
should: [
|
600
|
+
{ prefix: { hierarchy_field => term2 + '/' } },
|
601
|
+
{ term: { hierarchy_field => term2 } }
|
602
|
+
]
|
603
|
+
}
|
604
|
+
},
|
605
|
+
],
|
606
|
+
_cache: true
|
607
|
+
}
|
608
|
+
}
|
609
|
+
}
|
610
|
+
)
|
611
|
+
end
|
612
|
+
end
|
546
613
|
end
|
547
614
|
end
|
548
615
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: es-query-builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuku Takahashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|