Hi Nick,

Thank you very much for your response. I was exactly stuck on what you 
mentioned. I need to create an entry for the folder with the CFReader, but 
there is no internal functions supporting that. Folder implementation fails 
since it does a check for the cfmeta.json.

Secondly it does not seem like I can link CFReader (Folder*) as an entry to the 
enclosing folder since there is no function to link a folder inside a folder as 
far as I see. Can you confirm?

If the above is not an option, I was thinking of subclassing RAMFolder. I do 
not think I need to create a cfh file for that, but I will create my own Folder 
implementation with a static header file. I think this is the right approach. 
(Unless there is a better approach which does not require subclassing, e.g. by 
using inStreams)

Thanks again,
Serkan

On 2018/04/03 13:26:43, Nick Wellnhofer <wellnho...@aevum.de> wrote: 
> On 02/04/2018 19:52, serkanmula...@gmail.com wrote:
> > I realized that it is not possible to serialize the RAM index directly to 
> > bytes. This is why I made some tests to copy all files in the ram folder to 
> > FS folder by iterating over the contents for the RAM folder.
> 
> Yes, you have to inspect the RAMFolder using the private API of Folder, 
> FileHandle, InStream, etc. It's documented in the .cfh files in 
> core/Lucy/Store but it seems that you already figured this out.
> 
>      
> https://git1-us-west.apache.org/repos/asf?p=lucy.git;a=tree;f=core/Lucy/Store
> 
> > Why are there these virtual files? (I suspect that for optimization 
> > purposes (e.g. in order not to read the cfmeta.json file over again), 
> > virtual files hold the cfmeta.json values). So my question is, is it 
> > possible to create the virtual files from cfmeta.json value with an API 
> > call? Or do you have any other suggestions.
> 
> These are so-called "compound files" used to consolidate multiple files into 
> a 
> single one and reduce the number of open file handles. On the filesystem 
> level, there are two files cfmeta.json and cf.dat but Lucy's Store API 
> automatically returns information about the virtual files. If you want to 
> treat compound files as regular files, you have to check the Folder objects 
> returned by Folder_Find_Folder. If it's a Lucy::Store::CompoundFileReader, 
> call CFReader_Get_Real_Folder to get the actual RAMFolder or FSFolder:
> 
>      if (Folder_is_a(subfolder, COMPOUNDFILEREADER)) {
>          CompoundFileReader *cf_reader = (CompoundFileReader*)subfolder;
>          subfolder = CFReader_Get_Real_Folder(cf_reader);
>      }
> 
> After deserializing cfmeta.json and cf.dat into a RAMFolder, you'll have to 
> recreate the CFReaders and replace the entry in the enclosing folder. Have a 
> look at Folder_Consolidate to get the idea. But the `entries` hash isn't 
> exposed, so you probably can't do that without changes to the Lucy source 
> code.
> 
> As an alternative, you could try to change Lucy's behavior to not create 
> compound files for RAMFolders at all. Subclassing RAMFolder and making 
> Folder_Consolidate a no-op should work.
> 
> Nick
> 

Reply via email to