* VRFS-32; integrating elasticsearch and /api/search completed

This commit is contained in:
Seth Call 2012-11-07 07:10:41 -06:00
parent f9cc5f517f
commit 59d3f44478
4 changed files with 125 additions and 5 deletions

View File

@ -13,6 +13,8 @@ gem 'bcrypt-ruby', '3.0.1'
gem 'ruby-protocol-buffers', '1.2.2'
gem 'eventmachine'
gem 'amqp'
gem 'tire'
gem 'will_paginate'
group :test do
gem 'jam_db', :path=> "#{workspace}/jam-db/target/ruby_package"

View File

@ -3,12 +3,17 @@ require "active_record"
require "jampb"
require "uuidtools"
require "logging"
require "tire"
require "will_paginate"
require "will_paginate/active_record"
require "jam_ruby/errors/permission_error"
require "jam_ruby/errors/state_error"
require "jam_ruby/errors/jam_argument_error"
require "jam_ruby/mq_router"
require "jam_ruby/connection_manager"
require "jam_ruby/version"
require "jam_ruby/environment"
require "jam_ruby/tire_tasks"
require "jam_ruby/message_factory"
require "jam_ruby/models/genre"
require "jam_ruby/models/user"
@ -22,9 +27,10 @@ require "jam_ruby/models/instrument"
require "jam_ruby/models/connection_track"
require "jam_ruby/models/musician_instrument"
require "jam_ruby/models/band_musician"
require "jam_ruby/models/search"
include Jampb
module JamRuby
end

View File

@ -1,5 +1,7 @@
module JamRuby
class Band < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks
attr_accessible :name, :website, :biography
@ -24,6 +26,12 @@ module JamRuby
@logo_url = "http://www.jamkazam.com/images/bands/logos/#{self.id}.gif"
end
def location
# TODO: implement a single string version of location;
# this will be indexed into elasticsearch and returned in search
return "Austin, TX"
end
# helper method for creating / updating a Band
def self.save(params)
if params[:id].nil?
@ -74,5 +82,52 @@ module JamRuby
errors.add(:genres, "No more than 3 genres are allowed.")
end
end
### Elasticsearch/Tire integration ###
#
# Define the name based on the environment
# We wouldn't like to erase dev data during
# test runs!
#
index_name("#{Environment.mode}-#{Environment.application}-bands")
def to_indexed_json
{
:name => name,
:logo_url => logo_url,
:photo_url => photo_url,
:location => location
}.to_json
end
class << self
def create_search_index
Tire.index(Band.index_name) do
create(
:settings => Search.index_settings,
:mappings => {
"jam_ruby/band" => {
:properties => {
:logo_url => { :type => :string, :index => :not_analyzed, :include_in_all => false },
:photo_url => { :type => :string, :index => :not_analyzed, :include_in_all => false},
:name => { :type => :string, :boost => 100},
:location => { :type => :string },
}
}
}
)
end
end
def delete_search_index
search_index.delete
end
def search_index
Tire.index(Band.index_name)
end
end
### Elasticsearch/Tire integration
end
end

View File

@ -1,11 +1,13 @@
module JamRuby
class User < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks
attr_accessible :name, :email, :password, :password_confirmation
attr_accessor :updating_password
self.primary_key = 'id'
# connections (websocket-gateway)
has_many :connections, :class_name => "JamRuby::Connection"
@ -15,7 +17,7 @@ module JamRuby
# instruments
has_many :musician_instruments
has_many :instruments, :through => :musician_instruments, :class_name => "JamRuby::Instrument"
# bands
has_many :band_musicians
has_many :bands, :through => :band_musicians, :class_name => "JamRuby::Band"
@ -37,7 +39,7 @@ module JamRuby
# invitations
has_many :received_invitations, :foreign_key => "receiver_id", :inverse_of => :receiver, :class_name => "JamRuby::Invitation"
has_many :sent_invitations, :foreign_key => "sender_id", :inverse_of => :sender, :class_name => "JamRuby::Invitation"
has_secure_password
before_save { |user| user.email = email.downcase }
@ -65,6 +67,12 @@ module JamRuby
@photo_url = "http://www.jamkazam.com/images/users/photos/#{self.id}.gif";
end
def location
# TODO: implement a single string version of location;
# this will be indexed into elasticsearch and returned in search
return "Austin, TX"
end
def should_validate_password?
updating_password || new_record?
end
@ -143,9 +151,58 @@ module JamRuby
end
end
### Elasticsearch/Tire integration ###
#
# Define the name based on the environment
# We wouldn't like to erase dev data during
# test runs!
#
index_name("#{Environment.mode}-#{Environment.application}-users")
def to_indexed_json
{
:name => name,
:photo_url => photo_url,
:location => location,
:musician => musician
}.to_json
end
class << self
def create_search_index
Tire.index(User.index_name) do
create(
:settings => Search.index_settings,
:mappings => {
"jam_ruby/user" => {
:properties => {
:photo_url => { :type => :string, :index => :not_analyzed, :include_in_all => false},
:location => { :type => :string },
:name => { :type => :string, :boost => 100 },
:is_musician => { :type => :boolean, :index => :not_analyzed, :include_in_all => false}
}
}
}
)
end
end
def delete_search_index
search_index.delete
end
def search_index
Tire.index(User.index_name)
end
end
### Elasticsearch/Tire integration
private
def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
end
end
end
end