Skip to content

Commit

Permalink
CV2-6038: include explainer_title to has_article filter
Browse files Browse the repository at this point in the history
  • Loading branch information
melsawy committed Feb 6, 2025
1 parent 7038516 commit a051d0b
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 11 deletions.
12 changes: 12 additions & 0 deletions app/models/explainer_item.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class ExplainerItem < ApplicationRecord
validate :cant_apply_article_to_item_if_article_is_in_the_trash

after_create :log_relevant_article_results
after_commit :update_elasticsearch_data

def version_metadata(_changes)
{ explainer_title: self.explainer.title }.to_json
Expand All @@ -25,6 +26,17 @@ def cant_apply_article_to_item_if_article_is_in_the_trash
errors.add(:base, I18n.t(:cant_apply_article_to_item_if_article_is_in_the_trash)) if self.explainer&.trashed
end

def update_elasticsearch_data
return if self.disable_es_callbacks || RequestStore.store[:disable_es_callbacks]
pm = self.project_media
explainer_titles = pm.explainer_items.map(&:explainer).map(&:title).join(' ')
data = explainer_titles.blank? ? { explainer_title: nil } : { explainer_title: explainer_titles }
updated_at = Time.now
pm.update_columns(updated_at: updated_at)
data[:updated_at] = updated_at.utc
pm.update_elasticsearch_doc(data.keys, data, pm.id, true)
end

def log_relevant_article_results
ex = self.explainer
self.project_media.delay.log_relevant_results(ex.class.name, ex.id, User.current&.id, self.class.actor_session_id)
Expand Down
2 changes: 2 additions & 0 deletions app/repositories/media_search.rb
Original file line number Diff line number Diff line change
Expand Up @@ -132,5 +132,7 @@ class MediaSearch
indexes :negative_tipline_search_results_count, { type: 'long' }

indexes :tipline_search_results_count, { type: 'long' }

indexes :explainer_title, { type: 'text', analyzer: 'check' }
end
end
13 changes: 13 additions & 0 deletions db/migrate/20250205224319_add_mapping_for_explainer_title_field.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
class AddMappingForExplainerTitleField < ActiveRecord::Migration[6.1]
def change
options = {
index: CheckElasticSearchModel.get_index_alias,
body: {
properties: {
explainer_title: { type: 'text', analyzer: 'check' },
}
}
}
$repository.client.indices.put_mapping options
end
end
21 changes: 13 additions & 8 deletions lib/check_search.rb
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ def should_hit_elasticsearch?
end
filters_blank = true
['tags', 'keyword', 'language', 'fc_language', 'request_language', 'report_language', 'team_tasks', 'assigned_to', 'report_status', 'range_numeric',
'has_claim', 'cluster_teams', 'published_by', 'annotated_by', 'channels', 'cluster_published_reports'
'has_article', 'cluster_teams', 'published_by', 'annotated_by', 'channels', 'cluster_published_reports'
].each do |filter|
filters_blank = false unless @options[filter].blank?
end
Expand Down Expand Up @@ -309,7 +309,7 @@ def build_es_medias_query
custom_conditions.concat integer_terms_query('channel', 'channels')
custom_conditions.concat integer_terms_query('source_id', 'sources')
custom_conditions.concat doc_conditions
custom_conditions.concat has_claim_conditions
custom_conditions.concat has_article_conditions
custom_conditions.concat file_filter
custom_conditions.concat range_filter(:es)
custom_conditions.concat numeric_range_filter
Expand Down Expand Up @@ -530,13 +530,18 @@ def request_language_conditions
[{ nested: { path: 'requests', query: { terms: { 'requests.language': @options['request_language'] } } } }]
end

def has_claim_conditions
def has_article_conditions
conditions = []
return conditions unless @options.has_key?('has_claim')
if @options['has_claim'].include?('NO_VALUE')
conditions << { bool: { must_not: [ { exists: { field: 'claim_description_content' } } ] } }
elsif @options['has_claim'].include?('ANY_VALUE')
conditions << { exists: { field: 'claim_description_content' } }
return conditions unless @options.has_key?('has_article')
# Build a condidtion with fields that define the item has_article
has_article_c = []
['claim_description_content', 'explainer_title'].each do |field|
has_article_c << { exists: { field: field } }
end
if @options['has_article'].include?('NO_VALUE')
conditions << { bool: { must_not: has_article_c } }
elsif @options['has_article'].include?('ANY_VALUE')
conditions << { bool: { should: has_article_c } }
end
conditions
end
Expand Down
64 changes: 61 additions & 3 deletions test/controllers/elastic_search_9_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ def setup
setup_elasticsearch
end

test "should filter items by has_claim" do
test "should filter items by has_article" do
t = create_team
p = create_project team: t
u = create_user
Expand All @@ -19,13 +19,71 @@ def setup
create_claim_description project_media: pm, disable_es_callbacks: false
create_claim_description project_media: pm3, disable_es_callbacks: false
sleep 2
results = CheckSearch.new({ has_claim: ['ANY_VALUE'] }.to_json)
results = CheckSearch.new({ has_article: ['ANY_VALUE'] }.to_json)
assert_equal [pm.id, pm3.id], results.medias.map(&:id).sort
results = CheckSearch.new({ has_claim: ['NO_VALUE'] }.to_json)
results = CheckSearch.new({ has_article: ['NO_VALUE'] }.to_json)
assert_equal [pm2.id, pm4.id], results.medias.map(&:id).sort
end
end

test "should filter items by has_article 2" do
t = create_team
p = create_project team: t
u = create_user
create_team_user team: t, user: u, role: 'admin'
with_current_user_and_team(u ,t) do
pm = create_project_media team: t, disable_es_callbacks: false
pm2 = create_project_media team: t, disable_es_callbacks: false
pm3 = create_project_media team: t, disable_es_callbacks: false
pm4 = create_project_media team: t, disable_es_callbacks: false
pm5 = create_project_media team: t, disable_es_callbacks: false
cd = create_claim_description project_media: pm, disable_es_callbacks: false
ex2_a = create_explainer team: t
ex2_b = create_explainer team: t
ex3 = create_explainer team: t
pm2.explainers << ex2_a
pm2.explainers << ex2_b
pm3.explainers << ex3
ex4 = create_explainer team: t
cd4 = create_claim_description project_media: pm4, disable_es_callbacks: false
pm4.explainers << ex4
sleep 1
results = CheckSearch.new({ has_article: ['ANY_VALUE'] }.to_json)
assert_equal [pm.id, pm2.id, pm3.id, pm4.id], results.medias.map(&:id).sort
results = CheckSearch.new({ has_article: ['NO_VALUE'] }.to_json)
assert_equal [pm5.id], results.medias.map(&:id).sort
# remove explainer
ExplainerItem.where(explainer_id: ex2_a.id, project_media_id: pm2.id).destroy_all
ExplainerItem.where(explainer_id: ex3.id, project_media_id: pm2.id).destroy_all
cd4.project_id = nil
cd4.save!
sleep 1
results = CheckSearch.new({ has_article: ['ANY_VALUE'] }.to_json)
assert_equal [pm.id, pm2.id, pm4], results.medias.map(&:id).sort
results = CheckSearch.new({ has_article: ['NO_VALUE'] }.to_json)
assert_equal [pm3.id, pm5.id], results.medias.map(&:id).sort
# remove fact-check and explainer
cd.project_id = nil
cd.save!
ExplainerItem.where(explainer_id: ex2_b.id, project_media_id: pm2.id).destroy_all
ExplainerItem.where(explainer_id: ex4.id, project_media_id: pm4.id).destroy_all
sleep 1
results = CheckSearch.new({ has_article: ['ANY_VALUE'] }.to_json)
assert_empty results.medias.map(&:id)
results = CheckSearch.new({ has_article: ['NO_VALUE'] }.to_json)
assert_equal [pm.id, pm2.id, pm3.id, pm4.id, pm5.id], results.medias.map(&:id).sort
# re-assing fact or explainer
cd.project_id = pm2.id
cd.save!
pm5.explainers << ex
sleep 1
results = CheckSearch.new({ has_article: ['ANY_VALUE'] }.to_json)
assert_equal [pm2.id, pm5], results.medias.map(&:id).sort
results = CheckSearch.new({ has_article: ['NO_VALUE'] }.to_json)
assert_equal [pm.id, pm3.id, pm4.id], results.medias.map(&:id).sort
end
end

test "should search for keywords with typos" do
t = create_team
p = create_project team: t
Expand Down

0 comments on commit a051d0b

Please sign in to comment.