Commit 49c4ea61 by Hoang Phuc Do

Refactor code

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