require "fileutils" class MultiSolr::TimelineCoreHandler attr_reader :simple_core_handler_class attr_reader :core_group_name attr_reader :solr_url def initialize solr_url, core_group_name, simple_core_handler_class @simple_core_handler_class = simple_core_handler_class @core_group_name = core_group_name @solr_url = solr_url || raise("No solr-url given!") end def create_single_core_handler core_name=nil, options=nil core_name ||= last_core_name @simple_core_handler_class.new @solr_url, core_name, options end # Liefert Array mit den Namen der verfügbaren Cores, die mit dem Core-Namen (see core_name) beginnen # Diese Liste wird gecached def list_cores include_empties=false return @cores if @cores status = self.core_status @cores = [] matcher = Regexp.new "^#{@core_group_name}" status.each do |core_name, data| next unless matcher.match(core_name) next if data['index']['numDocs'] < 3 && !include_empties @cores << core_name end @cores.sort! MultiSolr.logger.info "MultiSolr::TimelineCoreHandler.list_cores: #{@cores.join(',')}" @cores end # Rücksetzen Cache der core-liste (see list_cores) def reset_cores @cores = @last_core_name = nil end # Liefert Name des letzte Cores der laut alphabetischer Liste (see list_cores) existiert def last_core_name @last_core_name ||= list_cores.last end def base_connection @_connection ||= RSolr.connect :url => @solr_url end def core_connection core_name=nil core_name ||= last_core_name RSolr.connect :url => "#{@solr_url}/#{core_name}" end def create_core suffix=nil suffix = Time.now.strftime('%Y%m%d-%H%M') if suffix.nil? new_core_name = "#{@core_group_name}-#{suffix}" status = self.core_status last_core_name old_name = status['name'] instance_dir_old = status['instanceDir'] instance_dir = instance_dir_old.sub(/^solr\//, '') # führendes solr im instanceDir ist zuviel, also entfernen data_dir = status['dataDir'].sub(/#{old_name}\/$/, new_core_name) data_dir.sub!(/^#{instance_dir_old}/, '')# führendes instanceDir im dataDir ist zuviel, also entfernen res = self.base_connection.get 'admin/cores', :params => {:action => 'CREATE', :name => new_core_name, :instanceDir => instance_dir, :dataDir => data_dir} reset_cores MultiSolr.logger.info "MultiSolr::TimelineCoreHandler.create_core: Core '#{new_core_name}' created. dataDir=#{data_dir}, instanceDir=#{instance_dir}" new_core_name end def dataimport import_handler_name, command='full-import', core_name=nil core_name ||= last_core_name con = core_connection core_name res = con.get import_handler_name, :params => {:command => command} MultiSolr.logger.info "MultiSolr::TimelineCoreHandler.dataimport: core=#{core_name}, command=#{command}, handler=#{import_handler_name}" res end # Entfernen angegebenen Core aus der Core-Liste inkl. unload-Befehl an den Solr # Achtung! Diese Methode löscht kann nur dann die physischen Daten des Cores löschen, # wenn dieser mit einer absoluten Pfad-Angabe im solr konfiguriert ist! # Parameter: # core_name: Name des zu löschenden Cores # with_data: optionaler Angabe ob Daten mit gelöscht werden sollen (Standardmäßig aus) def remove_core core_name, with_data=false status = self.core_status core_name raise "no core '#{core_name}'!" if status.nil? || status['name'].nil? base_connection.get 'admin/cores', :params => {:action => 'unload', :core => core_name} MultiSolr.logger.info "MultiSolr::TimelineCoreHandler.remove_core: Core '#{core_name}' unloaded" if with_data data_dir = status['dataDir'] raise "No absolute DataDir-Path! Only Core was unloaded!" unless data_dir.start_with?('/') FileUtils.rm_rf data_dir end reset_cores nil end # Liefert Core-Status evtl. aller Cores oder wenn Core-Name angegeben des einzelnen Cores # returns Hash mit den Statusdaten # Beispiel für alle Cores: # {'core-01'=>{'name'=>'core-01', # 'instanceDir'=>'solr/cobra-stock/', # 'dataDir'=>'solr/cobra-stock/../../data/cobra-stock/', # 'startTime'=>'2012-04-11T09:49:07.93Z', # 'uptime'=>7796905, # 'index'=>{'numDocs'=>1369046,'maxDoc'=>1369046,'version'=>1334134600492,'optimized'=>true,'current'=>true,'hasDeletions'=>false,'directory'=>'org.apache.lucene.store.NIOFSDirectory:org.apache.lucene.store.NIOFSDirectory@/home/bledig/Projects/lava/multi-solr/data/cobra-stock-20120411-1123/index lockFactory=org.apache.lucene.store.NativeFSLockFactory@1896a4c','lastModified'=>'2012-04-11T09:43:32Z'}}, # },... # } def core_status core_name=nil params = {:action => 'STATUS' } params[:core] = core_name if core_name res = base_connection.get 'admin/cores', :params => params status = res && res['status'] raise 'No status for cores available' if status.nil? return status[core_name] if core_name status end end