erp_search 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,46 @@
1
+ ErpSearch
2
+ =========
3
+
4
+ ERP Search adds Solr extensions to Compass using Sunspot.
5
+
6
+ Setup
7
+ =====
8
+ Copy vendor/plugins/erp_search/config/sunspot.yml to config/sunspot.yml
9
+ Edit config/sunspot.yml to your desired configuration if different from default
10
+
11
+
12
+ Example Usage
13
+ =============
14
+
15
+ Start Solr server:
16
+ rake sunspot:solr:start
17
+
18
+ Index Content:
19
+ rake sunspot:reindex_content
20
+
21
+ Index Parties:
22
+ rake sunspot:reindex_party_search_facts
23
+
24
+ Index Roles:
25
+ rake sunspot:reindex_roles
26
+
27
+ Stop Solr server:
28
+ rake sunspot:solr:stop
29
+
30
+
31
+ Example Usage if using Tenancy
32
+ ==============================
33
+
34
+ Index Content for All Tenants:
35
+ rake sunspot:tenants:reindex_content
36
+
37
+ Index Content for a single Tenant:
38
+ rake sunspot:tenant:reindex_content['schema_name']
39
+
40
+
41
+ Gem Dependencies
42
+ ================
43
+ sunspot_rails
44
+ sunspot
45
+
46
+ Copyright (c) 2011 Adam Hull, released under the MIT license
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'ErpSearch'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
25
+
26
+ Bundler::GemHelper.install_tasks
27
+
28
+ require "rspec/core/rake_task"
29
+ RSpec::Core::RakeTask.new(:spec)
30
+ task :default => :spec
31
+
32
+
@@ -0,0 +1,9 @@
1
+ // This is a manifest file that'll be compiled into including all the files listed below.
2
+ // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
3
+ // be included in the compiled file accessible from http://example.com/assets/application.js
4
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
+ // the compiled file.
6
+ //
7
+ //= require jquery
8
+ //= require jquery_ujs
9
+ //= require_tree .
@@ -0,0 +1,7 @@
1
+ /*
2
+ * This is a manifest file that'll automatically include all the stylesheets available in this directory
3
+ * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
4
+ * the top of the compiled file, but it's generally better to create a new file per style scope.
5
+ *= require_self
6
+ *= require_tree .
7
+ */
@@ -0,0 +1,4 @@
1
+ module ErpSearch
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module ErpSearch
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,83 @@
1
+ Content.class_eval do
2
+ after_save :sunspot_commit
3
+ after_destroy :sunspot_commit
4
+
5
+ if $USE_SOLR_FOR_CONTENT
6
+
7
+ searchable do
8
+ if $USE_TENANCY
9
+ string :tenant_id do
10
+ Thread.current[:tenant_id]
11
+ end
12
+ end
13
+ text :title
14
+ text :excerpt_html
15
+ text :body_html
16
+ string :website_section_id do
17
+ # index website_section_id so solr does not need reindexed when section title/permalink changes
18
+ website_sections.first.id rescue 0
19
+ end
20
+ string :type do
21
+ website_sections.first.type rescue ''
22
+ end
23
+ string :website_id do
24
+ website_sections.first.website_id rescue 0
25
+ end
26
+ end
27
+
28
+ # alias_method :search, :solr_search unless method_defined? :search
29
+ # the above line in sunspot plugin doesn't allow you to overwrite the search method in content base model.
30
+ # add this to force overwriting it.
31
+ def self.search(options = {}, &block)
32
+ self.solr_search(options = {}, &block)
33
+ end
34
+
35
+ # overwrite and add solr functionality.
36
+ def self.do_search(options = {})
37
+
38
+ if options[:section_permalink].nil? or options[:section_permalink].blank?
39
+ website_section_id = nil
40
+ else
41
+ website_section_id = WebsiteSection.find_by_permalink_and_website_id(options[:section_permalink], options[:website_id]).id rescue nil
42
+ end
43
+
44
+ @results = Content.search do
45
+ unless options[:query].empty?
46
+ keywords options[:query]
47
+ end
48
+
49
+ unless options[:content_type].nil? or options[:content_type].empty?
50
+ with(:type, options[:content_type])
51
+ end
52
+
53
+ unless website_section_id.nil?
54
+ with(:website_section_id, website_section_id)
55
+ end
56
+
57
+ if $USE_TENANCY
58
+ with(:tenant_id, Thread.current[:tenant_id])
59
+ end
60
+
61
+ with(:website_id, options[:website_id])
62
+ paginate :page => options[:page], :per_page => options[:per_page]
63
+ end
64
+
65
+ @search_results = build_search_results(@results.results)
66
+
67
+ @page_results = WillPaginate::Collection.create(options[:page], options[:per_page], @results.results.total_entries) do |pager|
68
+ pager.replace(@search_results)
69
+ end
70
+
71
+ return @page_results
72
+ end
73
+
74
+ def total_pages
75
+ page_count
76
+ end
77
+
78
+ def sunspot_commit
79
+ Sunspot.commit
80
+ end
81
+ end
82
+
83
+ end
@@ -0,0 +1,3 @@
1
+ Party.class_eval do
2
+ has_one :party_search_fact, :dependent => :destroy
3
+ end
@@ -0,0 +1,80 @@
1
+ class PartySearchFact < ActiveRecord::Base
2
+ after_destroy :sunspot_commit
3
+
4
+ belongs_to :party
5
+
6
+ searchable do
7
+ integer :party_id
8
+ string :eid
9
+ string :type
10
+ string :roles, :multiple => true do
11
+ roles.split(/,\s*/) unless roles.nil?
12
+ end
13
+ text :party_description
14
+ string :party_description
15
+ string :party_business_party_type
16
+ text :user_login
17
+ text :individual_current_last_name
18
+ text :individual_current_first_name
19
+ string :individual_current_middle_name
20
+ string :individual_birth_date
21
+ text :individual_ssn
22
+ text :party_phone_number
23
+ text :party_email_address
24
+ string :party_address_1
25
+ string :party_address_2
26
+ string :party_primary_address_city
27
+ string :party_primary_address_state
28
+ text :party_primary_address_zip
29
+ string :party_primary_address_country
30
+ string :user_enabled
31
+ string :user_type
32
+ end
33
+
34
+ def self.update_search_fact(party)
35
+ sf = PartySearchFact.find(:first, :conditions => ["party_id = ?", party.id])
36
+
37
+ sf = PartySearchFact.create(:party_id => party.id) if sf.nil?
38
+ sf.update_search_fact(party)
39
+ end
40
+
41
+ def self.destroy_search_fact(party)
42
+ sf = PartySearchFact.find(:first, :conditions => ["party_id = ?", party.id])
43
+
44
+ return if sf.nil?
45
+
46
+ sf.destroy
47
+ end
48
+
49
+ def update_search_fact(party)
50
+ self.update_attributes(
51
+ :party_id => party.id,
52
+ :eid => party.enterprise_identifier,
53
+ :roles => (party.user.roles.map { |role| role.internal_identifier }.join(',') rescue ''),
54
+ :party_description => party.description,
55
+ :party_business_party_type => party.business_party_type,
56
+ :user_login => (party.user.login rescue ''),
57
+ :individual_current_last_name => (party.business_party.current_last_name rescue ''),
58
+ :individual_current_first_name => (party.business_party.current_first_name rescue ''),
59
+ :individual_current_middle_name => (party.business_party.current_middle_name rescue ''),
60
+ :individual_birth_date => (party.business_party.birth_date rescue ''),
61
+ :individual_ssn => (party.business_party.ssn_last_four rescue ''),
62
+ :party_phone_number => (party.personal_phone_number.phone_number rescue ''),
63
+ :party_email_address => (party.personal_email_address.email_address rescue ''),
64
+ :party_address_1 => (party.home_postal_address.address_line_1 rescue ''),
65
+ :party_address_2 => (party.home_postal_address.address_line_2 rescue ''),
66
+ :party_primary_address_city => (party.home_postal_address.city rescue ''),
67
+ :party_primary_address_state => (party.home_postal_address.state rescue ''),
68
+ :party_primary_address_zip => (party.home_postal_address.zip rescue ''),
69
+ :party_primary_address_country => (party.home_postal_address.country rescue ''),
70
+ :user_enabled => (party.user.enabled rescue false),
71
+ :user_type => (party.user.attributes['type'] rescue '')
72
+ )
73
+ Sunspot.commit
74
+ end
75
+
76
+ def sunspot_commit
77
+ Sunspot.commit
78
+ end
79
+
80
+ end
@@ -0,0 +1,16 @@
1
+ class ContactObserver < ActiveRecord::Observer
2
+
3
+ def after_save(contact)
4
+ begin
5
+ PartySearchFact.update_search_fact(contact.party)
6
+ rescue
7
+ end
8
+ end
9
+
10
+ def after_destroy(contact)
11
+ begin
12
+ PartySearchFact.update_search_fact(contact.party)
13
+ rescue
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ class EmailAddressObserver < ActiveRecord::Observer
2
+ # NOTE: updating search fact here is redundant,
3
+ # Contact observer is being called via has_contact.after_save => Contact.save => ContactObserver.after_save
4
+
5
+ end
@@ -0,0 +1,6 @@
1
+ class IndividualObserver < ActiveRecord::Observer
2
+
3
+ # NOTE: updating search fact here is redundant,
4
+ # Party observer is being called via Individual.after_save => Party.save => PartyObserver.after_save
5
+
6
+ end
@@ -0,0 +1,6 @@
1
+ class OrganizationObserver < ActiveRecord::Observer
2
+
3
+ # NOTE: updating search fact here is redundant,
4
+ # Party observer is being called via Organization.after_save => Party.save => PartyObserver.after_save
5
+
6
+ end
@@ -0,0 +1,10 @@
1
+ class PartyObserver < ActiveRecord::Observer
2
+
3
+ def after_save(party)
4
+ begin
5
+ PartySearchFact.update_search_fact(party)
6
+ rescue
7
+ end
8
+ end
9
+
10
+ end
@@ -0,0 +1,4 @@
1
+ class PhoneNumberObserver < ActiveRecord::Observer
2
+ # NOTE: updating search fact here is redundant,
3
+ # Contact observer is being called via has_contact.after_save => Contact.save => ContactObserver.after_save
4
+ end
@@ -0,0 +1,6 @@
1
+ class PostalAddressObserver < ActiveRecord::Observer
2
+
3
+ # NOTE: updating search fact here is redundant,
4
+ # Contact observer is being called via has_contact.after_save => Contact.save => ContactObserver.after_save
5
+
6
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>ErpSearch</title>
5
+ <%= stylesheet_link_tag "erp_search/application" %>
6
+ <%= javascript_include_tag "erp_search/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,2 @@
1
+ ErpSearch::Engine.routes.draw do
2
+ end
@@ -0,0 +1,29 @@
1
+ #Defaults to 8981 in test, 8982 in development and 8983 in production.
2
+
3
+ development:
4
+ solr:
5
+ hostname: 127.0.0.1
6
+ port: 8982
7
+ path: /solr
8
+ log_level: INFO
9
+
10
+ test:
11
+ solr:
12
+ hostname: 127.0.0.1
13
+ port: 8981
14
+ path: /solr
15
+ log_level: WARNING
16
+
17
+ production:
18
+ solr:
19
+ hostname: 127.0.0.1
20
+ port: 8983
21
+ path: /solr
22
+ log_level: WARNING
23
+
24
+ adam:
25
+ solr:
26
+ port: 8982
27
+ hostname: 127.0.0.1
28
+ path: /solr
29
+ log_level: INFO
@@ -0,0 +1,39 @@
1
+ class RecreatePartySearchFactsTable < ActiveRecord::Migration
2
+ def self.up
3
+ drop_table :party_search_facts if table_exists?(:party_search_facts)
4
+
5
+ unless table_exists?(:party_search_facts)
6
+ create_table :party_search_facts do |t|
7
+ t.column :party_id, :integer
8
+ t.column :eid, :string
9
+ t.column :type, :string
10
+ t.column :roles, :text
11
+ t.column :party_description, :string
12
+ t.column :party_business_party_type, :string
13
+ t.column :user_login, :string
14
+ t.column :individual_current_last_name, :string
15
+ t.column :individual_current_first_name, :string
16
+ t.column :individual_current_middle_name, :string
17
+ t.column :individual_birth_date, :string
18
+ t.column :individual_ssn, :string
19
+ t.column :party_phone_number, :string
20
+ t.column :party_email_address, :string
21
+ t.column :party_address_1, :string
22
+ t.column :party_address_2, :string
23
+ t.column :party_primary_address_city, :string
24
+ t.column :party_primary_address_state, :string
25
+ t.column :party_primary_address_zip, :string
26
+ t.column :party_primary_address_country, :string
27
+ t.column :user_enabled, :boolean
28
+ t.column :user_type, :string
29
+ t.column :reindex, :boolean
30
+
31
+ t.timestamps
32
+ end
33
+ end
34
+ end
35
+
36
+ def self.down
37
+ drop_table :party_search_facts if table_exists?(:party_search_facts)
38
+ end
39
+ end
@@ -0,0 +1,6 @@
1
+ require "erp_search/engine"
2
+
3
+ $USE_SOLR_FOR_CONTENT = true
4
+
5
+ module ErpSearch
6
+ end