* new basis for the save and load system of the index
* the old index will disappear and IndexSearcher will be the interface for searching through the index
This commit is contained in:
parent
fcfc48c3ec
commit
d5057a5a26
|
@ -1,4 +1,7 @@
|
||||||
class Polecat
|
class Polecat
|
||||||
require 'polecat/index'
|
require 'polecat/index'
|
||||||
|
require 'polecat/index_writer'
|
||||||
|
require 'polecat/index_reader'
|
||||||
|
require 'polecat/index_searcher'
|
||||||
require 'polecat/document'
|
require 'polecat/document'
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
class Polecat
|
||||||
|
# reads an index directory
|
||||||
|
#
|
||||||
|
# This class reads the content of an index directory and builds the
|
||||||
|
# necessary structures for the index type.
|
||||||
|
class IndexReader
|
||||||
|
attr_reader :path
|
||||||
|
|
||||||
|
# initialize a new reader
|
||||||
|
#
|
||||||
|
# Create a new reader for the given path. If the directory is empty, you
|
||||||
|
# will get an empty index, else all documents stored in that directory.
|
||||||
|
# @param [String] path the path to the index directory
|
||||||
|
def initialize path
|
||||||
|
@path = path
|
||||||
|
raise ArgumentError, 'no valid directory' unless File.directory? @path
|
||||||
|
end
|
||||||
|
|
||||||
|
# read the content of the directory
|
||||||
|
#
|
||||||
|
# Read all files of the directory and return an index object.
|
||||||
|
# @raise [IOError] raised when the directory is locked
|
||||||
|
# @return [Polecat::Index] the index with all documents
|
||||||
|
def read
|
||||||
|
raise IOError, 'index is locked' if locked?
|
||||||
|
files = Dir[@path + '/*']
|
||||||
|
if files.count > 0
|
||||||
|
documents = []
|
||||||
|
files.each do |file|
|
||||||
|
documents += Marshal.load(File.read(file))
|
||||||
|
end
|
||||||
|
else
|
||||||
|
{}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# checks whether the directory is locked or not
|
||||||
|
def locked?
|
||||||
|
if File.exists? @path + '/index.lock'
|
||||||
|
true
|
||||||
|
else
|
||||||
|
false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,32 @@
|
||||||
|
class Polecat
|
||||||
|
# interface for searching an index
|
||||||
|
#
|
||||||
|
# Build on top of an Polecat::IndexReader, this class let's you search through
|
||||||
|
# all documents stored in an index.
|
||||||
|
class IndexSearcher
|
||||||
|
attr_reader :reader
|
||||||
|
|
||||||
|
# creates a new Polecat::IndexSearcher
|
||||||
|
#
|
||||||
|
# Create a new Polecat::IndexSearcher to search documents. Either a path
|
||||||
|
# to a directory or a Polecat::IndexReader has to be given, to make this
|
||||||
|
# searcher work.
|
||||||
|
# @example
|
||||||
|
# # the following has the same meaning
|
||||||
|
# IndexSearcher.new 'index_dir'
|
||||||
|
# IndexSearcher.new(IndexReader.new 'index_dir')
|
||||||
|
def initialize *args
|
||||||
|
if args[0].class == Polecat::IndexReader
|
||||||
|
@reader = args[0]
|
||||||
|
elsif args[0].class == String
|
||||||
|
@reader = Polecat::IndexReader.new args[0]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# returns the path of the index directory
|
||||||
|
# @return [String] path of the index directory
|
||||||
|
def path
|
||||||
|
@reader.path
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -79,5 +79,12 @@ class Polecat
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# creates an index reader with the writers path
|
||||||
|
#
|
||||||
|
# @returns [Polecat::IndexReader] an IndexReader with the same path
|
||||||
|
def create_reader
|
||||||
|
Polecat::IndexReader.new @path
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
||||||
|
|
||||||
|
describe "IndexReader#locked?" do
|
||||||
|
before do
|
||||||
|
@path = prepare_index_dir
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns false when the directory is not locked" do
|
||||||
|
r = Polecat::IndexReader.new @path
|
||||||
|
r.locked?.should == false
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns true when the directory is locked" do
|
||||||
|
FileUtils.touch @path + '/index.lock'
|
||||||
|
r = Polecat::IndexReader.new @path
|
||||||
|
r.locked?.should == true
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,21 @@
|
||||||
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
||||||
|
|
||||||
|
describe "IndexReader#new" do
|
||||||
|
before do
|
||||||
|
@path = prepare_index_dir
|
||||||
|
end
|
||||||
|
|
||||||
|
it "takes a directory path as an argument" do
|
||||||
|
r = Polecat::IndexReader.new @path
|
||||||
|
r.path.should == @path
|
||||||
|
end
|
||||||
|
|
||||||
|
it "raises an error when no path is given" do
|
||||||
|
lambda { Polecat::IndexReader.new }.should raise_error(ArgumentError)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "raises an error when the path is not a directory" do
|
||||||
|
lambda { Polecat::IndexReader.new '/dev/null' }.should(
|
||||||
|
raise_error(ArgumentError))
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,40 @@
|
||||||
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
||||||
|
|
||||||
|
describe "IndexReader#read" do
|
||||||
|
before do
|
||||||
|
@path = prepare_index_dir
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns a hash with all documents" do
|
||||||
|
r = Polecat::IndexReader.new @path
|
||||||
|
r.read.class.should == Hash
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns an empty hash for a empty directory" do
|
||||||
|
r = Polecat::IndexReader.new @path
|
||||||
|
r.read.count.should == 0
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns the document count found in the index directory" do
|
||||||
|
w = Polecat::IndexWriter.new @path
|
||||||
|
w.add Spec::FooDocument.new(:id => 23)
|
||||||
|
w.write
|
||||||
|
r = Polecat::IndexReader.new @path
|
||||||
|
r.read.count.should == 1
|
||||||
|
end
|
||||||
|
|
||||||
|
it "merges all documents from different files together" do
|
||||||
|
w = Polecat::IndexWriter.new @path
|
||||||
|
w.add Spec::FooDocument.new(:id => 23)
|
||||||
|
w.write
|
||||||
|
w.add Spec::FooDocument.new(:id => 24)
|
||||||
|
w.write
|
||||||
|
w.create_reader.read.count.should == 2
|
||||||
|
end
|
||||||
|
|
||||||
|
it "raises an error when the directory is locked" do
|
||||||
|
FileUtils.touch @path + '/index.lock'
|
||||||
|
r = Polecat::IndexReader.new @path
|
||||||
|
lambda { r.read }.should raise_error(IOError)
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,17 @@
|
||||||
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
||||||
|
|
||||||
|
describe "IndexSearcher#new" do
|
||||||
|
before do
|
||||||
|
@path = prepare_index_dir
|
||||||
|
end
|
||||||
|
|
||||||
|
it "takes a path as an arugment" do
|
||||||
|
s = Polecat::IndexSearcher.new @path
|
||||||
|
s.path.should == @path
|
||||||
|
end
|
||||||
|
|
||||||
|
it "takes an IndexReader as an argument" do
|
||||||
|
s = Polecat::IndexSearcher.new(Polecat::IndexReader.new @path)
|
||||||
|
s.path.should == @path
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,22 @@
|
||||||
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
||||||
|
|
||||||
|
describe "IndexReader#read" do
|
||||||
|
before do
|
||||||
|
@path = prepare_index_dir
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns a IndexReader" do
|
||||||
|
w = Polecat::IndexWriter.new @path
|
||||||
|
w.create_reader.class.should == Polecat::IndexReader
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns a different object everytime it is called" do
|
||||||
|
w = Polecat::IndexWriter.new @path
|
||||||
|
w.create_reader.should_not == w.create_reader
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns an IndexReader with the same path" do
|
||||||
|
w = Polecat::IndexWriter.new @path
|
||||||
|
w.create_reader.path.should == w.path
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue