Commit 49c4ea61 by Hoang Phuc Do

Refactor code

parent 6270ece4
...@@ -2,7 +2,7 @@ class ProductsController < ApplicationController ...@@ -2,7 +2,7 @@ class ProductsController < ApplicationController
before_action :authenticate_user!, only: [:new, :edit, :create, :update, :destroy] before_action :authenticate_user!, only: [:new, :edit, :create, :update, :destroy]
before_action :set_product, only: :show before_action :set_product, only: :show
before_action :user_can_edit_product, only: [:edit, :update, :destroy] before_action :user_can_edit_product, only: [:edit, :update, :destroy]
before_action :set_search, only: [:create, :update, :destroy] before_action :set_solr, only: [:create, :update, :destroy]
# GET /products/new # GET /products/new
def new def new
...@@ -13,7 +13,7 @@ class ProductsController < ApplicationController ...@@ -13,7 +13,7 @@ class ProductsController < ApplicationController
def create def create
@product = Product.new(product_params.merge(user_id: current_user.id)) @product = Product.new(product_params.merge(user_id: current_user.id))
if @product.save if @product.save
@search.add_product(@product) @solr.add_product_index(@product)
redirect_to root_url, flash: { success: "Product #{@product.title} is sucessfully created" } redirect_to root_url, flash: { success: "Product #{@product.title} is sucessfully created" }
else else
render 'new' render 'new'
...@@ -23,7 +23,7 @@ class ProductsController < ApplicationController ...@@ -23,7 +23,7 @@ class ProductsController < ApplicationController
# PATCH/PUT /products/1 # PATCH/PUT /products/1
def update def update
if @product.update(product_params) if @product.update(product_params)
@search.update_product(@product) @solr.update_product_index(@product)
redirect_to root_url, flash: { success: "Product #{@product.title} is sucessfully updated" } redirect_to root_url, flash: { success: "Product #{@product.title} is sucessfully updated" }
else else
render 'edit' render 'edit'
...@@ -34,7 +34,7 @@ class ProductsController < ApplicationController ...@@ -34,7 +34,7 @@ class ProductsController < ApplicationController
def destroy def destroy
if @product.destroy if @product.destroy
flash[:success] = "Product #{@product.title} deleted" flash[:success] = "Product #{@product.title} deleted"
@search.delete_product(@product) @solr.delete_product_index(@product)
else else
flash[:alert] = "Product #{@product.title} can't be deleted" flash[:alert] = "Product #{@product.title} can't be deleted"
end end
...@@ -61,7 +61,7 @@ class ProductsController < ApplicationController ...@@ -61,7 +61,7 @@ class ProductsController < ApplicationController
redirect_to root_url, flash: { alert: 'You do not have permission to edit this product' } if @product.blank? redirect_to root_url, flash: { alert: 'You do not have permission to edit this product' } if @product.blank?
end end
def set_search def set_solr
@search = Search.new @solr = Solr.new
end end
end end
\ No newline at end of file
class ProductFilter class ProductFilter
def initialize(solr) def filter_product_title(title)
@solr = solr title.blank? ? 'title:*' : "title:#{RSolr.solr_escape(title)}"
end end
def filter_search_query(search_query) def filter_suggest_keyword(keyword)
search_query = search_query.blank? ? '*' : RSolr.solr_escape(search_query) RSolr.solr_escape(keyword)
@solr.query_product_title(search_query)
end
def filter_suggest_query(suggest_query)
@solr.query_product_suggestion(RSolr.solr_escape(suggest_query))
end end
end end
\ No newline at end of file
class Search class Search
def initialize def initialize
@solr = SolrSearch.new @solr = Solr.new
@product_filter = ProductFilter.new(@solr)
end end
# Get matched products with keyword
def products(search_query) def products(search_query)
matched_products(@product_filter.filter_search_query(search_query)) matched_products(ProductFilter.filter_product_title(search_query))
end end
# Get suggested keywords
def suggested_keywords(keyword) def suggested_keywords(keyword)
@product_filter.filter_suggest_query(keyword).map { |kw| kw['term'] } keywords = @solr.exec_suggest_request(ProductFilter.filter_suggest_keyword(keyword))
end keywords.map { |kw| kw['term'] }
def update_product(product)
@solr.update_product_index(product)
end
def add_product(product)
@solr.add_product_index(product)
end
def delete_product(product)
@solr.delete_product_index(product)
end end
private private
......
require 'rsolr' require 'rsolr'
class SolrSearch class Solr
attr_accessor :rsolr attr_accessor :rsolr
def initialize def initialize
@rsolr = RSolr.connect url: Settings.rsolr.address @rsolr = RSolr.connect url: Settings.rsolr.address
end end
def query_product_title(search_query) def exec_select_request(query)
response = rsolr.get 'select', params: { q: "title:#{search_query}" } response = rsolr.get 'select', params: { q: query }
response['response']['docs'] response['response']['docs']
end end
def query_product_suggestion(search_query) def exec_suggest_request(query)
response = rsolr.get 'suggest', params: { 'suggest.q' => search_query } response = rsolr.get 'suggest', params: { 'suggest.q' => query }
response['suggest']['productSuggester'][search_query]['suggestions'] response['suggest']['productSuggester'][query]['suggestions']
end
def add_products_indexes(products)
rsolr.add products
end end
def update_product_index(product) def update_product_index(product)
......
namespace :vs_solr do namespace :vs_solr do
desc 'Import product data from database' desc 'Import product data from database'
task product: :environment do task product: :environment do
documents = [] products = []
Product.all.each do |product| Product.all.each do |product|
documents << { id: product.id, title: product.title, price: product.price } products << { id: product.id,
title: product.title,
price: product.price }
end end
SolrSearch.new.rsolr.add documents Solr.new.add_products_indexes(products)
end end
desc 'Remove all index from Solr' desc 'Remove all index from Solr'
task remove: :environment do task remove: :environment do
SolrSearch.new.delete_all_product_indexes Solr.new.delete_all_product_indexes
end end
end 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