Created
August 19, 2014 21:31
-
-
Save tonyta/4550b84de67eeb7cf840 to your computer and use it in GitHub Desktop.
solr_play
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module JobSearcher | |
class << self | |
def search(state: 'any_state', **params) | |
searcher_class = "JobSearcher::#{ state.camelize }".safe_constantize | |
if searcher_classes.include?(searcher_class) | |
searcher_class.new(params) | |
else | |
nil | |
end | |
end | |
# def routes | |
# searcher_classes.map { |klass| get_aspects(klass) }.flatten! | |
# end | |
# private | |
# def get_aspects(klass) | |
# klass.public_instance_methods(false).map do |method| | |
# "#{ klass }/#{ method }".underscore | |
# end | |
# end | |
def states | |
searcher_classes.map { |klass| klass.to_s.match(/::(\w*)$/)[1].underscore } | |
end | |
def searcher_classes | |
BaseSearcher.descendants | |
end | |
end | |
class AdvancedFilterBuilder | |
def initialize(query, filter) | |
@query = query | |
@filter = filter | |
end | |
def run | |
filter_account_manager | |
filter_writer_or_editor_email | |
filter_requires_expertise | |
filter_state | |
filter_extra_review | |
filter_format | |
filter_deadline | |
end | |
private | |
attr_reader :query, :filter | |
def filter_account_manager | |
if value = filter[:account_manager] | |
if value == 'unclaimed' | |
query.with(:admin_id, nil) | |
else | |
query.with(:admin_id).equal_to(value) | |
end | |
end | |
end | |
def filter_writer_or_editor_email | |
writer_id = writer_id_by_email(filter[:writer_email]) | |
case filter[:writer_or_editor] | |
when "writer" | |
filter_writer(writer_id) | |
when "editor" | |
filter_editor(editor_id) | |
end | |
end | |
def filter_writer(writer_id) | |
query.with(:writer_id, writer_id) | |
end | |
def filter_editor(editor_id) | |
query.with(:writer_id, editor_id) | |
end | |
def writer_id_by_email(email) | |
writer = Writer.find_by(email: email) rescue nil | |
writer ? writer.id.to_s : nil | |
end | |
def filter_requires_expertise | |
query.with(:requires_expertise, true) if filter[:only_specialist_jobs] | |
end | |
def filter_state | |
query.with(:state, filter[:state]) if filter[:state] | |
end | |
def filter_extra_review | |
if filter[:extra_review_stage] | |
query.with(:extra_review_stage, filter[:extra_review_stage]) | |
end | |
end | |
def filter_format | |
query.with(:format_id, filter[:format_id]) if filter[:format_id] | |
end | |
def filter_deadline | |
if filter[:deadline_at] | |
date = Date.strptime(filter[:deadline_at], "%m/%d/%Y") | |
start = Time.parse('11:30am', date) | |
finish = Time.parse('11:30pm', date) | |
query.with(:deadline_at, start..finish) | |
end | |
end | |
end | |
class BaseSearcher | |
extend Forwardable | |
def_delegators :@searcher, :results, :hits, :total | |
def_delegator :'@searcher.results', :current_page, :page | |
def_delegator :'@searcher.results', :per_page, :per_page | |
def initialize(params) | |
searchable_class = FinishedJob | |
setup = Sunspot::Setup.for(searchable_class) | |
@params = params.with_indifferent_access | |
@searcher = Sunspot.new_search(searchable_class) | |
@query = Sunspot::DSL::Search.new(searcher, setup) | |
@advanced_filterer = AdvancedFilterBuilder.new(query, params[:filter]) | |
build_search | |
end | |
def inspect | |
output = "\#<#{self.class.to_s}:" | |
output << " total=#{total}, page=#{page}, per_page=#{per_page}," | |
output << " hits=#{hits}," | |
output << "\n@searcher=\##{searcher.inspect}" | |
output << ">" | |
end | |
private | |
attr_reader :params, :searcher, :query, :advanced_filterer | |
def build_search | |
setup_perspective | |
setup_aspect | |
setup_ordering | |
setup_calendar_faceting | |
setup_fulltext_search | |
setup_advanced_filtering | |
setup_pagination | |
searcher.execute | |
end | |
def setup_perspective | |
setup_admin if admin? | |
setup_business if business? | |
setup_writer if writer? | |
end | |
def setup_admin | |
query.with(:needs_cc).equal_to(false) | |
end | |
def setup_business | |
query.with(:business_id).equal_to(params[:business_id]) | |
end | |
def setup_writer | |
query.with(:writer_id).equal_to(params[:writer_id]) | |
end | |
def setup_aspect | |
aspect = params[:aspect] && params[:aspect].to_sym | |
if aspect && public_methods(false).include?(aspect) | |
send(aspect) | |
end | |
base_search | |
end | |
def setup_ordering | |
query.order_by(:deadline_at, :asc) | |
end | |
def setup_calendar_faceting; end | |
def setup_fulltext_search | |
query.fulltext(params[:fulltext_search]) | |
end | |
def setup_advanced_filtering | |
advanced_filterer.run | |
end | |
def setup_pagination; end | |
def admin? | |
params[:admin_id].present? | |
end | |
def business? | |
params[:business_id].present? | |
end | |
def writer? | |
params[:writer_id].present? | |
end | |
def all; end | |
end | |
class InAuthorship < BaseSearcher | |
def specialists | |
query.with(:requires_expertise).equal_to(true) | |
end | |
def red_flags | |
query.any_of do | |
with(:flake_type, %w(implicit explicit)) | |
with(:no_content).equal_to(true) | |
with(:writer_deadline_at).less_than(Time.now) | |
end | |
end | |
def unclaimed | |
query.with(:taken).equal_to(false) | |
end | |
def claimed | |
query.with(:taken).equal_to(true) | |
end | |
def superheroes | |
claimed | |
query.with(:flake_type, %w(implicit explicit)) | |
end | |
private | |
def base_search | |
query.with(:state).equal_to(IN_AUTHORSHIP) | |
end | |
end | |
# class Plagiarized < BaseSearcher | |
# def all | |
# query.with(:state).equal_to(PLAGIARIZED) | |
# base_search | |
# end | |
# def ithenticate | |
# query.with(:paraphrased).equal_to(false) | |
# all | |
# end | |
# def paraphrased | |
# query.with(:paraphrased).equal_to(true) | |
# all | |
# end | |
# end | |
# class NeedsExtraReview < BaseSearcher | |
# def all | |
# query.with(:state).equal_to(NEEDS_EXTRA_REVIEW) | |
# query.order_by(:deadline_at, :desc) | |
# base_search | |
# end | |
# def by_admin | |
# query.with(:extra_reviewer_type).equal_to('Admin') | |
# all | |
# end | |
# def by_business | |
# query.with(:extra_reviewer_type).equal_to('Business') | |
# all | |
# end | |
# def by_editor | |
# query.with(:extra_reviewer_type).equal_to('Writer') | |
# all | |
# end | |
# end | |
# class InExtraReview < BaseSearcher | |
# def all | |
# query.with(:state).equal_to(IN_EXTRA_REVIEW) | |
# base_search | |
# end | |
# end | |
# class FixingExtraReview < BaseSearcher | |
# def all | |
# query.with(:state).equal_to(FIXING_EXTRA_REVIEW) | |
# base_search | |
# end | |
# end | |
# class NeedsReview < BaseSearcher | |
# def all | |
# query.with(:state).equal_to(NEEDS_REVIEW) | |
# base_search | |
# end | |
# end | |
# class NeedsFinalReview < BaseSearcher | |
# def all | |
# query.with(:state).equal_to(NEEDS_FINAL_REVIEW) | |
# base_search | |
# end | |
# end | |
# class AnyState < BaseSearcher | |
# def all | |
# query.order_by(:deadline_at, :desc) | |
# base_search | |
# end | |
# end | |
# class Reviewed < BaseSearcher | |
# def all | |
# query.with(:state).greater_than(NEEDS_FINAL_REVIEW) | |
# query.order_by(:deadline_at, :desc) | |
# base_search | |
# end | |
# end | |
# class InAnyEdits < BaseSearcher | |
# def all | |
# query.with(:state, [FIXING_PLAGIARISM, FIXING_EXTRA_REVIEW, NEEDS_EDITS]) | |
# query.with(:sent_to_writer_at).less_than(2.days.ago) if admin? | |
# base_search | |
# end | |
# end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment