: I don't think it's useful to somehow programmatically access the list
: of fields that a fieldType could output.
based on my understanding of the potential types of use cases we're
talking about, i think i agree with you. It seems like the most crucial
aspect is that a FieldType has a way of producing multiple
o.a.l.document.Field instances (potentially with different field names)
from a single String input at index time. this can be done with something
like the API that Grant mentioned earlier.
For anything except non-trivial use cases, any code (like a query parser)
attempting to deal with this fields is going to need to be very special
purpose and have direct knowledge of the code in the FieldType. if a
"CartesienGeoSearchQParser" is asked to parse
"store_location:89.3,45.4~5miles" it can throw a parse exception if
IndexSchema.getFieldType("store_location") isn't an instanceof
"CartesianGeoSearchFieldType" -- assuming it is: it can cast it and call
CartesianGeoSearchFieldType specific methods to find out everything it
needs to know about what multitudes of field names that specific instance
produced based on it's configuration. (side thought: we may want to add a
"getFieldTypesByClass" method to the IndexSchema so QParsers and
SearchComponents can get lists of fields matching special cases they want
to know about -- but that's a secondary concern)
One thing that concerns me is potential field name collision -- where one
of these new multifield producing FieldTypes might want to creat a name
that happens to collide with a field the user has already declared.
Using Double underscores kind of feels like a hack, what i keep wondering
is if we can't leverage dynamicFields here. if we require that these
FieldTypes be declared using <dynamicField> delcarations (they could error
on init otherwise) then the wildcard nature of the name tells the
FieldType where it's allowed to add things to the pattern to make unique
field names in the index -- and they can still be used as true dynamic
fields, as long as they always add to the field name given to them.
something like...
<dynamicField name="location*" type="geo1" />
can be use to index a single "location" field (internal construction
"location_lat" and "location_lon" or it could be used to support a
"location_start" and "location_end" field (using
location_start_lat+location_start_lon and
location_end_lat+location_end_lon)
-Hoss