Fixed issue #2059 - Incorrect display count of a report profile if tree_select is used.
This commit is contained in:
parent
4cd36cb200
commit
8a6ffc23cb
3 changed files with 82 additions and 7 deletions
|
@ -232,8 +232,8 @@ test:integration:es:
|
||||||
- bundle exec rake zammad:db:unseeded
|
- bundle exec rake zammad:db:unseeded
|
||||||
- bundle exec rails test test/integration/elasticsearch_active_test.rb
|
- bundle exec rails test test/integration/elasticsearch_active_test.rb
|
||||||
- bundle exec rails test test/integration/elasticsearch_test.rb
|
- bundle exec rails test test/integration/elasticsearch_test.rb
|
||||||
- bundle exec rails test test/integration/report_test.rb
|
|
||||||
- bundle exec rspec --tag searchindex
|
- bundle exec rspec --tag searchindex
|
||||||
|
- bundle exec rails test test/integration/report_test.rb
|
||||||
|
|
||||||
### Zendesk
|
### Zendesk
|
||||||
|
|
||||||
|
|
|
@ -333,7 +333,7 @@ remove whole data from index
|
||||||
return if url.blank?
|
return if url.blank?
|
||||||
|
|
||||||
url += if index
|
url += if index
|
||||||
if index.class == Array
|
if index.is_a?(Array)
|
||||||
"/#{index.join(',')}/_search"
|
"/#{index.join(',')}/_search"
|
||||||
else
|
else
|
||||||
"/#{index}/_search"
|
"/#{index}/_search"
|
||||||
|
@ -399,6 +399,7 @@ remove whole data from index
|
||||||
next if value.blank?
|
next if value.blank?
|
||||||
next if order_by&.at(index).blank?
|
next if order_by&.at(index).blank?
|
||||||
|
|
||||||
|
# for sorting values use .raw values (no analyzer is used - plain values)
|
||||||
if value !~ /\./ && value !~ /_(time|date|till|id|ids|at)$/
|
if value !~ /\./ && value !~ /_(time|date|till|id|ids|at)$/
|
||||||
value += '.raw'
|
value += '.raw'
|
||||||
end
|
end
|
||||||
|
@ -435,6 +436,24 @@ remove whole data from index
|
||||||
|
|
||||||
get count of tickets and tickets which match on selector
|
get count of tickets and tickets which match on selector
|
||||||
|
|
||||||
|
result = SearchIndexBackend.selectors(index, selector)
|
||||||
|
|
||||||
|
example with a simple search:
|
||||||
|
|
||||||
|
result = SearchIndexBackend.selectors('Ticket', { category: { operator: 'is', value: 'aa::ab' } })
|
||||||
|
|
||||||
|
result = [
|
||||||
|
{ id: 1, type: 'Ticket' },
|
||||||
|
{ id: 2, type: 'Ticket' },
|
||||||
|
{ id: 3, type: 'Ticket' },
|
||||||
|
]
|
||||||
|
|
||||||
|
you also can get aggregations
|
||||||
|
|
||||||
|
result = SearchIndexBackend.selectors(index, selector, options, aggs_interval)
|
||||||
|
|
||||||
|
example for aggregations within one year
|
||||||
|
|
||||||
aggs_interval = {
|
aggs_interval = {
|
||||||
from: '2015-01-01',
|
from: '2015-01-01',
|
||||||
to: '2015-12-31',
|
to: '2015-12-31',
|
||||||
|
@ -447,9 +466,8 @@ get count of tickets and tickets which match on selector
|
||||||
current_user: User.find(123),
|
current_user: User.find(123),
|
||||||
}
|
}
|
||||||
|
|
||||||
result = SearchIndexBackend.selectors(index, selector, options, aggs_interval)
|
result = SearchIndexBackend.selectors('Ticket', { category: { operator: 'is', value: 'aa::ab' } }, options, aggs_interval)
|
||||||
|
|
||||||
# for aggregations
|
|
||||||
result = {
|
result = {
|
||||||
hits:{
|
hits:{
|
||||||
total:4819,
|
total:4819,
|
||||||
|
@ -482,7 +500,7 @@ get count of tickets and tickets which match on selector
|
||||||
return if url.blank?
|
return if url.blank?
|
||||||
|
|
||||||
url += if index
|
url += if index
|
||||||
if index.class == Array
|
if index.is_a?(Array)
|
||||||
"/#{index.join(',')}/_search"
|
"/#{index.join(',')}/_search"
|
||||||
else
|
else
|
||||||
"/#{index}/_search"
|
"/#{index}/_search"
|
||||||
|
@ -553,9 +571,23 @@ get count of tickets and tickets which match on selector
|
||||||
key_tmp = key.sub(/^.+?\./, '')
|
key_tmp = key.sub(/^.+?\./, '')
|
||||||
t = {}
|
t = {}
|
||||||
|
|
||||||
|
# use .raw in cases where query contains ::
|
||||||
|
if data['value'].is_a?(Array)
|
||||||
|
data['value'].each do |value|
|
||||||
|
if value.is_a?(String) && value =~ /::/
|
||||||
|
key_tmp += '.raw'
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elsif data['value'].is_a?(String)
|
||||||
|
if /::/.match?(data['value'])
|
||||||
|
key_tmp += '.raw'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# is/is not/contains/contains not
|
# is/is not/contains/contains not
|
||||||
if data['operator'] == 'is' || data['operator'] == 'is not' || data['operator'] == 'contains' || data['operator'] == 'contains not'
|
if data['operator'] == 'is' || data['operator'] == 'is not' || data['operator'] == 'contains' || data['operator'] == 'contains not'
|
||||||
if data['value'].class == Array
|
if data['value'].is_a?(Array)
|
||||||
t[:terms] = {}
|
t[:terms] = {}
|
||||||
t[:terms][key_tmp] = data['value']
|
t[:terms][key_tmp] = data['value']
|
||||||
else
|
else
|
||||||
|
|
|
@ -1,10 +1,36 @@
|
||||||
require 'test_helper'
|
require 'integration_test_helper'
|
||||||
|
|
||||||
class ReportTest < ActiveSupport::TestCase
|
class ReportTest < ActiveSupport::TestCase
|
||||||
include SearchindexHelper
|
include SearchindexHelper
|
||||||
|
|
||||||
setup do
|
setup do
|
||||||
|
|
||||||
|
# create attribute
|
||||||
|
attribute1 = ObjectManager::Attribute.add(
|
||||||
|
object: 'Ticket',
|
||||||
|
name: 'test_category',
|
||||||
|
display: 'Test 1',
|
||||||
|
data_type: 'tree_select',
|
||||||
|
data_option: {
|
||||||
|
maxlength: 200,
|
||||||
|
null: false,
|
||||||
|
default: '',
|
||||||
|
options: [
|
||||||
|
{ 'name' => 'aa', 'value' => 'aa', 'children' => [{ 'name' => 'aa', 'value' => 'aa::aa' }, { 'name' => 'bb', 'value' => 'aa::bb' }, { 'name' => 'cc', 'value' => 'aa::cc' }] },
|
||||||
|
{ 'name' => 'bb', 'value' => 'bb', 'children' => [{ 'name' => 'aa', 'value' => 'bb::aa' }, { 'name' => 'bb', 'value' => 'bb::bb' }, { 'name' => 'cc', 'value' => 'bb::cc' }] },
|
||||||
|
{ 'name' => 'cc', 'value' => 'cc', 'children' => [{ 'name' => 'aa', 'value' => 'cc::aa' }, { 'name' => 'bb', 'value' => 'cc::bb' }, { 'name' => 'cc', 'value' => 'cc::cc' }] },
|
||||||
|
]
|
||||||
|
},
|
||||||
|
active: true,
|
||||||
|
screens: {},
|
||||||
|
position: 20,
|
||||||
|
created_by_id: 1,
|
||||||
|
updated_by_id: 1,
|
||||||
|
editable: false,
|
||||||
|
to_migrate: false,
|
||||||
|
)
|
||||||
|
ObjectManager::Attribute.migration_execute
|
||||||
|
|
||||||
configure_elasticsearch(required: true)
|
configure_elasticsearch(required: true)
|
||||||
|
|
||||||
Ticket.destroy_all
|
Ticket.destroy_all
|
||||||
|
@ -26,6 +52,7 @@ class ReportTest < ActiveSupport::TestCase
|
||||||
priority: Ticket::Priority.lookup(name: '2 normal'),
|
priority: Ticket::Priority.lookup(name: '2 normal'),
|
||||||
created_at: '2015-10-28 09:30:00 UTC',
|
created_at: '2015-10-28 09:30:00 UTC',
|
||||||
updated_at: '2015-10-28 09:30:00 UTC',
|
updated_at: '2015-10-28 09:30:00 UTC',
|
||||||
|
test_category: 'cc::bb',
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
)
|
)
|
||||||
|
@ -1353,6 +1380,22 @@ class ReportTest < ActiveSupport::TestCase
|
||||||
assert(result)
|
assert(result)
|
||||||
assert_nil(result[:ticket_ids][0])
|
assert_nil(result[:ticket_ids][0])
|
||||||
|
|
||||||
|
# search for test_category.raw to find values with :: in query
|
||||||
|
result = Report::TicketGenericTime.items(
|
||||||
|
range_start: Time.zone.parse('2015-01-01T00:00:00Z'),
|
||||||
|
range_end: Time.zone.parse('2015-12-31T23:59:59Z'),
|
||||||
|
selector: {
|
||||||
|
'test_category' => {
|
||||||
|
'operator' => 'is',
|
||||||
|
'value' => 'cc::bb'
|
||||||
|
},
|
||||||
|
}, # ticket selector to get only a collection of tickets
|
||||||
|
params: { field: 'created_at' },
|
||||||
|
)
|
||||||
|
|
||||||
|
assert(result)
|
||||||
|
assert_equal(@ticket1.id, result[:ticket_ids][0].to_i)
|
||||||
|
assert_nil(result[:ticket_ids][1])
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue