Skip to content

Instantly share code, notes, and snippets.

@tonyta
Created August 19, 2014 21:31
Show Gist options
  • Save tonyta/4550b84de67eeb7cf840 to your computer and use it in GitHub Desktop.
Save tonyta/4550b84de67eeb7cf840 to your computer and use it in GitHub Desktop.
solr_play
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