/* * call-seq: * IndexReader.new(dir) -> index_reader * * Create a new IndexReader. You can either pass a string path to a * file-system directory or an actual Ferret::Store::Directory object. For * example; * * dir = RAMDirectory.new() * iw = IndexReader.new(dir) * * dir = FSDirectory.new("/path/to/index") * iw = IndexReader.new(dir) * * iw = IndexReader.new("/path/to/index") * * You can also create a what used to be known as a MultiReader by passing an * array of IndexReader objects, Ferret::Store::Directory objects or * file-system paths; * * iw = IndexReader.new([dir, dir2, dir3]) * * iw = IndexReader.new([reader1, reader2, reader3]) * * iw = IndexReader.new(["/path/to/index1", "/path/to/index2"]) */ static VALUE frb_ir_init(VALUE self, VALUE rdir) { Store *store = NULL; IndexReader *ir; int i; FieldInfos *fis; VALUE rfield_num_map = rb_hash_new(); if (TYPE(rdir) == T_ARRAY) { VALUE rdirs = rdir; const int reader_cnt = RARRAY_LEN(rdir); IndexReader **sub_readers = ALLOC_N(IndexReader *, reader_cnt); int i; for (i = 0; i < reader_cnt; i++) { rdir = RARRAY_PTR(rdirs)[i]; switch (TYPE(rdir)) { case T_DATA: if (CLASS_OF(rdir) == cIndexReader) { Data_Get_Struct(rdir, IndexReader, sub_readers[i]); REF(sub_readers[i]); continue; } else if (RTEST(rb_obj_is_kind_of(rdir, cDirectory))) { store = DATA_PTR(rdir); } else { rb_raise(rb_eArgError, "A Multi-IndexReader can only " "be created from other IndexReaders, " "Directory objects or file-system paths. " "Not %s", rs2s(rb_obj_as_string(rdir))); } break; case T_STRING: frb_create_dir(rdir); store = open_fs_store(rs2s(rdir)); DEREF(store); break; default: rb_raise(rb_eArgError, "%s isn't a valid directory " "argument. You should use either a String or " "a Directory", rs2s(rb_obj_as_string(rdir))); break; } sub_readers[i] = ir_open(store); } ir = mr_open(sub_readers, reader_cnt); Frt_Wrap_Struct(self, &frb_mr_mark, &frb_ir_free, ir); } else { switch (TYPE(rdir)) { case T_DATA: store = DATA_PTR(rdir); break; case T_STRING: frb_create_dir(rdir); store = open_fs_store(rs2s(rdir)); DEREF(store); break; default: rb_raise(rb_eArgError, "%s isn't a valid directory argument. " "You should use either a String or a Directory", rs2s(rb_obj_as_string(rdir))); break; } ir = ir_open(store); Frt_Wrap_Struct(self, &frb_ir_mark, &frb_ir_free, ir); } object_add(ir, self); fis = ir->fis; for (i = 0; i < fis->size; i++) { FieldInfo *fi = fis->fields[i]; rb_hash_aset(rfield_num_map, FSYM2SYM(fi->name), INT2FIX(fi->number)); } rb_ivar_set(self, id_fld_num_map, rfield_num_map); return self; }