1) regardless of the verb (updatable/modifiable) i'm not sure that it
makes sense to annotate in the schema the fields that should be copied on
update, and not label the feilds that must be "set" on update (ie: the
fields that cannot be copied)

I agree.  I started down that path, and it gets pretty ugly.  I
stopped.  I have opted for a syntax that 'updates' all stored fields,
but lets you say explicitly what to do for each field.  If there is a
stored field you want to skip, you can specify that in command rather
then in the schema.



another simple approach would be to make "updatability" a property of the
schema, that can contain a few different values...
 "strict" - indexed and stored are no longer valid field(type)
            attributes -- all fields are indexed and stored. all fields
            are copied on "update" unless the update command inlcudes
            instructions to replace, append or incriment the field value
  "loose" - indexed/stored still exist, any attempt to "update" an
            existing document is legal, all stored fields are copied
            on update unless the update command includes in structures
            to replace, append or increment the field value.
   "none" - any attempt to update will fail.


This is an interisting idea, but (if i'm understaning your suggestion
correctly) it seems like TOO big of change from the existing schema.

The more I think about the 'error' behavior, I am convinced we just
need solid, easily explainable logic for what happens and why.  I
think throwing an error if there are no stored fields is reasonable
and only updating stored fields is simple enough logic I don't think
we need to over complicate it.


another approach i don't really have fully fleshed out in my head would be
to introduce a concept of "fieldsets" ... an update that
sets/appends/incrments a field in a fieldset which does not provide a

I may be working on this, but not sure if it is what you are saying.  I have:

public class IndexDocumentCommand
{
 public enum FieldMODE {
   APPEND,    // add the fields to existing fields
   OVERWRITE, // overwrite existing fields
   INCREMENT, // increment existing field.  Must be a number!
   DISTINCT,  // same as APPEND, but make sure there are distinct values
   IGNORE     // ignore the previous value -- don't copy it
 };

 public Iterable<SolrDocument> docs;
 public Map<String,FieldMODE> fieldMode; // What to do for each field.
 public int commitMaxTime = -1;
}

If fieldMode is null or they are all OVERWRITE, the addDoc command
behaves as it always has.  Otherwise, it first extracts the exiting
stored values (unless the fieldMode is IGNORE) then applies the new
documents value on top of the old one.

Currently I am only handling wildcard substitution for "*" - the
default mode.  I have not tried to tackle dynamic fields yet...  it
seems a bit more complicated!

Reply via email to