Commit 612b302e by Ngô Trung Hưng

use Strategy pattern

parent 0d67bd1c
Pipeline #1045 canceled with stages
in 0 seconds
class SearchController < ApplicationController
NUMBER_RECORD_IN_PAGE = 10
before_action :load_data_dropdown, only: :multi_search
before_action :load_data_dropdown
def multi_search
solr = connect_solr
def search
@keyword = params[:keyword]
@industry = Industry.find_by(id: params[:industry_id]) if params[:industry_id].present?
@city = City.find_by(id: params[:city_id]) if params[:city_id].present?
data = sub_space_params!(params[:keyword], params[:industry_id], params[:city_id])
query = if params[:keyword].blank? && params[:industry_id].blank? && params[:city_id].blank?
'*:*'
else
"solr((name: #{data[:keyword]}) OR (company_name: #{data[:keyword]})) AND (industry_id: #{data[:industry_id]}) AND (location_id: #{data[:location_id]})"
end
response = solr.paginate(params[:page], NUMBER_RECORD_IN_PAGE, 'select', params: { q: query })
@results = Kaminari.paginate_array(response['response']['docs'], total_count: response['response']['numFound']).page(params[:page]).per(NUMBER_RECORD_IN_PAGE)
@results = Search::Query.new.search(params[:keyword], params[:industry_id], params[:city_id], params[:page])
return render 'error/page_not_found' if params[:page].to_i > @results.total_pages
render :result
end
def sub_space_params!(keyword, industry_id, location_id)
arr_params = {}
arr_params[:keyword] = RSolr.solr_escape(keyword)
arr_params[:industry_id] = RSolr.solr_escape(industry_id)
arr_params[:location_id] = RSolr.solr_escape(location_id)
arr_params.each_value { |val| val.sub!('', '*') if val.blank? }
end
def load_data_dropdown
@industries = Industry.order(name: :asc)
@cities = City.select(:id, :name)
end
private
def connect_solr
SolrSetting::SolrServer.connection
end
end
# frozen_string_literal: true
module ApplyJobHelper
end
module RegistrationsHelper
end
......@@ -4,16 +4,7 @@
<div class="box_jobs">
<div class="col-sm-12 d-block d-sm-none">
<div class="link_favorite_top block_link_favorite md">
<% if user_signed_in? %>
<% favorite_id = current_user.favorites.find_by(job_id: data['id']) %>
<% if favorite_id.present? %>
<%= render 'job/link_destroy', favorite_id: favorite_id %>
<% else %>
<%= render 'job/link_create', job_id: data['id'] %>
<% end %>
<% else %>
<span class="link_favorite span_click_favorite"><i class="far fa-heart"></i></span>
<% end %>
<%= render 'btn_func_favorite', data: data %>
</div>
</div>
<div class="row">
......@@ -38,16 +29,7 @@
</div>
<div class="col-sm-2 col-md-3 d-none d-sm-block col-lg-2">
<div class="link_favorite_top block_link_favorite">
<% if user_signed_in? %>
<% favorite_id = current_user.favorites.find_by(job_id: data['id']) %>
<% if favorite_id.present? %>
<%= render 'job/link_destroy', favorite_id: favorite_id %>
<% else %>
<%= render 'job/link_create', job_id: data['id'] %>
<% end %>
<% else %>
<span class="link_favorite span_click_favorite"><i class="far fa-heart"></i></span>
<% end %>
<%= render 'btn_func_favorite', data: data %>
</div>
</div>
</div>
......
<% if user_signed_in? %>
<% favorite_id = current_user.favorites.find_by(job_id: data['id']) %>
<% if favorite_id.present? %>
<%= render 'job/link_destroy', favorite_id: favorite_id %>
<% else %>
<%= render 'job/link_create', job_id: data['id'] %>
<% end %>
<% else %>
<span class="link_favorite span_click_favorite"><i class="far fa-heart"></i></span>
<% end %>
<div class="col-lg-12">
<div class="breadcrumb_total_search_pagination_jobs">
<div class="pagination_jobs">
<div id="paginator">
<%= paginate results %>
</div>
</div>
</div>
</div>
\ No newline at end of file
......@@ -10,7 +10,7 @@
<div style="word-wrap: break-word;">
<%= "#{t('pages.result.all')} #{@results.total_count}" %>
</div>
<% elsif @results.total_count > 0 %>
<% elsif @results.total_count.positive? %>
<%= t('pages.result.result_find', job: @results.total_count, key: @keyword).html_safe %>
<% else %>
<%= t('pages.result.no_result_find', key: @keyword).html_safe %>
......@@ -19,30 +19,14 @@
</span>
</div>
</div>
<div class="col-lg-12">
<div class="breadcrumb_total_search_pagination_jobs">
<div class="pagination_jobs">
<div id="paginator">
<%= paginate @results %>
</div>
</div>
</div>
</div>
<%= render 'paginate', results: @results %>
</div>
</div>
<%= render 'job/modal_login' %>
<%= render partial: 'block_info_job', collection: @results, as: :data %>
<div class="container">
<div class="row">
<div class="col-lg-12">
<div class="breadcrumb_total_search_pagination_jobs">
<div class="pagination_jobs">
<div class="paginator">
<%= paginate @results %>
</div>
</div>
</div>
</div>
<%= render 'paginate', results: @results %>
</div>
</div>
<%= render 'shared/scroll_top' %>
......@@ -6,7 +6,7 @@ Rails.application.routes.draw do
devise_for :users, controllers: { registrations: 'registrations', passwords: 'passwords'}
root 'home#index'
# Search
get 'search', to: 'search#multi_search', as: :search
get 'search', to: 'search#search', as: :search
get 'register/:code', to: 'users#confirm_sign_up', as: :confirm_sign_up
get 'industries', to: 'industry#index', as: :industry_index
get 'cities', to: 'city#index', as: :city_index
......
number_result_search_in_page: 10
module Search
class Query
def search(keyword, industry_id, city_id, params_page)
solr = connect_solr
# Escape input & Convert space to asterisks
data = sub_space_params!(keyword, industry_id, city_id)
query = if keyword.blank? && industry_id.blank? && city_id.blank?
'*:*'
else
"solr((name: #{data[:keyword]}) OR (company_name: #{data[:keyword]})) AND (industry_id: #{data[:industry_id]}) AND (location_id: #{data[:location_id]})"
end
response = solr.paginate(params_page, Settings.number_result_search_in_page, 'select', params: { q: query })
results = Kaminari.paginate_array(response['response']['docs'], total_count: response['response']['numFound']).page(params_page).per(Settings.number_result_search_in_page)
end
def sub_space_params!(keyword, industry_id, location_id)
arr_params = {}
arr_params[:keyword] = RSolr.solr_escape(keyword)
arr_params[:industry_id] = RSolr.solr_escape(industry_id)
arr_params[:location_id] = RSolr.solr_escape(location_id)
arr_params.each_value { |val| val.sub!('', '*') if val.blank? }
end
private
def connect_solr
SolrSetting::SolrServer.connection
end
end
end
\ No newline at end of file
module StrategySolr
class BaseIndex
def logger
@logger ||= Logger.new(Rails.root.join('log', 'indexed_data_to_solr.log'))
end
def indexed
puts 'Indexed data from db to solr'
end
end
end
module StrategySolr
class IndexData
attr_reader :data, :collection_name
def initialize(data, collection_name)
@data = data
@collection_name = collection_name
end
def indexed
collection_name.indexed(data)
end
end
end
# frozen_string_literal: true
module StrategySolr
class JobIndexed < BaseIndex
class IndexData
def logger
@logger ||= Logger.new(Rails.root.join('log', 'indexed_data_to_solr.log'))
end
def self.indexed(job)
def indexed(job)
solr = SolrSetting::SolrServer.connection
data = {}
data[:id] = job.id
......@@ -21,4 +18,5 @@ class IndexData
rescue StandardError => e
logger.error "Indexed data to Solr have error: #{e}"
end
end
end
......@@ -56,7 +56,7 @@ class CrawlerJob < Crawler
description: data[:description])
create_industry_relation(data[:industry_name], job)
create_city_relation(data[:city_name], job)
IndexData.indexed(job)
StrategySolr::IndexData.new(job, StrategySolr::JobIndexed.new).indexed
rescue StandardError => e
logger.error "Crawler data jobs has error: #{e}"
end
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment