I agree Jody, this is a better design. But do we really need the new 
interface. And I don't mean can you think of hypothetical situations in 
which we could use it? I mean is there someone waiting on this issue and 
will be able to commit an implementation and use it within a few weeks.

If the answer is no, I fear we are designing this for the sake of 
designing it.

-Justin


Jody Garnett wrote:
> We are heading into proposal territory :-( However I think you have 
> found a real issue with the Function api - I am sorry I did not catch it 
> earlier.
> 
> Here is the use code example:
> 
> interface Function {
>    String getName();
>    List getParams();
> }
> class FunctionImpl {
>    Object evaulate ( Object obj, Class context ){
>             String name = getName();
>             List<Object> params = new ArrayList<Object>();
>             for( Expression expr : getParams() ){
>                 params.add( expr.evaulate( obj ), null );
>             }
>             Library library = LibraryFinder.find( name, params );
>             Object value = library.evaulate( name, params );
>             return new Value( value ).value( context );
>    }
> }
> interface Library {
>     FilterCapabilities getFilterCapabilities(); // definition of library 
> functions with name and parameters
>     Object evaluate( String name, List params );
> }
> 
> Observations:
> - I combined LibraryFactory and Library since the object is stateless.
> - We should use the FilterCapabilies to force the the parameters into 
> the correct type
>> Ok you have an interesting idea Jody, but I really need to focus here 
>> and not wander off on a design tangent.
> Try and find easy problems them; problems with API are almost always 
> design related.
>> How will i look up all functions available and report back their names 
>> and number of arguments? Code example welcome :).
> for( Library  library : LibraryFinder.getAll() ){
>       FilterCapabilities capabilities = library.getFilterCapabilities();
>       // informatin about function names and number of objects is in 
> capabilities object
> }
>>
>> -Justin
>>
>> Jody Garnett wrote:
>>> I think you hit the nail on the head ... we are talking about 
>>> different things :-)
>>>
>>> Indeed I think I am onto something and a lot of the reason we are 
>>> having problems of this nature is due to a design mistake we made.
>>>
>>> Let me outline Idea #2 and see if it makes sense (for get your 
>>> problem for a moment and think on what "Function" is for)
>>>
>>> Function - interface matching Filter 1.1, represents "name", and some 
>>> parameters as specified by the user
>>> FunctionImpl - direct implementation of the above, able to store the 
>>> "name" and "parameters"
>>>
>>> (Nowhere am I talking about Cosine extends Function able to store 
>>> "cos" and two parameters)
>>>
>>> This is *it* - a definition of what Function needs to do for us at 
>>> the GeoAPI level to capture Filter 1.1.
>>>
>>> We do however have this idea where we would like to evaulate( Object 
>>> ) a Function can get a value back, to do that we need to go from 
>>> Function to an implementation (we need to look up "cos" and use our 
>>> two parameters to get a value).
>>>
>>>
>>> If you remember for our implementation of PropertyAcessor we had 
>>> *one* implementation that only knew how to work with Features. We 
>>> broke this assumption and made our implementation of evaulate look up 
>>> "propertyaccessors" that had implementations for Feature, POJOs, etc...
>>>
>>> I think we have the same situation going on here; and I can capture 
>>> it in a single question:
>>> - Can we (in GeoTools) parse a Filter document that uses a function 
>>> for which we have no matching implementation?
>>>
>>> To continue; the information you wanted to know (the number of 
>>> parameters) is documented in the FilterCapabilities; it should *not* 
>>> be modeled as part of the Function. Separation between data and 
>>> metadata.
>>>
>>> Jody
>>>> Hmm, you seem to make the separation between interface an 
>>>> implementation in both your ideas, I am not sure that is the issue. 
>>>> I think the issue is that we are not properly modelling a function. 
>>>> Or at least not the parameters anyways.
>>>>
>>>> Function parameters are something that will change each time the 
>>>> function is called. The more I think about it the more I think that 
>>>> they need to be mutable.
>>>>
>>>> Regardless, I am sorry I dont understand either of your ideas Jody :).
>>>>
>>>> -Justin
>>>>
>>>> Jody Garnett wrote:
>>>>> Justin Deoliveira wrote:
>>>>>> Hi all,
>>>>>>
>>>>>> Transitioning from the geotools FunctionExpression to geoapi 
>>>>>> Function has raised an issue. The FunctionExpression interface had 
>>>>>> the "getNumArgs()" method which returns the number of arguments 
>>>>>> the function can take. The api was also mutable which meant I 
>>>>>> could create the function, and then set its arguments.
>>>>>>
>>>>>> However, with Function I don't have this ability. The Function 
>>>>>> interface is immutable, which means that I cant create an instance 
>>>>>> of a function without having the parameters that I intend to 
>>>>>> evaluate it with. The number of arguments would then be available 
>>>>>> via getParameters().size().
>>>>>>   The underlying problem is that in a Filter capabilities document 
>>>>>> one needs to declare which functions are available and how many 
>>>>>> arguments they have. There is really no way to do this with this api.
>>>>>>   
>>>>> Idea#1:  Good conflict; should this be moved to a FunctionFactory API?
>>>>>
>>>>> Do we not need to have access to the description of the service 
>>>>> (FunctionFactory in
>>>>> this case) in order to produce that filter capabilities 
>>>>> description?; the creation of an
>>>>> actual Function to do the work is a separate matter.
>>>>>
>>>>> This is a tough one; since we are stuck between data representation 
>>>>> (ie perhaps the user
>>>>> has an invalid function call?) and implementation (perhaps the 
>>>>> implementation only *has* two fields
>>>>> to store arguments in.
>>>>> Idea#2: Separate as with PropertyAcccessor
>>>>>
>>>>> It strikes me we have the same scenario as with PropertyAccessor; 
>>>>> the ability to "hold" the users request
>>>>> is different from the implementation used to satisfy it.
>>>>>
>>>>> 1. Make Function *pure* so we can represent what the user said
>>>>> 2. Make a LibraryFactory that returns FilterCapabilies information 
>>>>> describing the function implementations made available, and makes a 
>>>>> Library object capable of doing the work.
>>>>> 3. When evaluating a Function process the LibraryFactory list, 
>>>>> grabbing the library that can implement the function the user 
>>>>> specified, and then call that implementation
>>>>>
>>>>> Consequences:
>>>>> - Note this makes it easy for us to advertise the abilities of back 
>>>>> end data sources (like Oracle) simply in terms of FilterCapabilies; 
>>>>> in this case the "implementation" would not be provided - the 
>>>>> function would just be written out with the SQL writer.
>>>>> - It would be simple to do a first cut of a Library based simply on 
>>>>> Java reflection (using the Math class as an example)
>>>>>> So... any ideas on how to proceed? Should we make Function "semi 
>>>>>> mutable", in that you can create one without specifying any 
>>>>>> parameters, and then call #getParamters().add( ... ). I guess we 
>>>>>> would also need a method for the number of parameters.
>>>>>>   
>>>>> I am not sure this would work for someone creating a "formula 
>>>>> builder"; what do you think of the above two ideas?
>>>>>
>>>>> Cheers,
>>>>> Jody
>>>>>
>>>>> ------------------------------------------------------------------------- 
>>>>>
>>>>> Using Tomcat but need to do more? Need to support web services, 
>>>>> security?
>>>>> Get stuff done quickly with pre-integrated technology to make your 
>>>>> job easier.
>>>>> Download IBM WebSphere Application Server v.1.0.1 based on Apache 
>>>>> Geronimo
>>>>> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 
>>>>>
>>>>> _______________________________________________
>>>>> Geoapi-devel mailing list
>>>>> [EMAIL PROTECTED]
>>>>> https://lists.sourceforge.net/lists/listinfo/geoapi-devel
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>>
>>> ------------------------------------------------------------------------- 
>>>
>>> Using Tomcat but need to do more? Need to support web services, 
>>> security?
>>> Get stuff done quickly with pre-integrated technology to make your 
>>> job easier.
>>> Download IBM WebSphere Application Server v.1.0.1 based on Apache 
>>> Geronimo
>>> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
>>> _______________________________________________
>>> Geoapi-devel mailing list
>>> [EMAIL PROTECTED]
>>> https://lists.sourceforge.net/lists/listinfo/geoapi-devel
>>>
>>>
>>>
>>
>>
> 
> 
> !DSPAM:1004,45c8f4a2144911410093335!
> 


-- 
Justin Deoliveira
[EMAIL PROTECTED]
The Open Planning Project
http://topp.openplans.org

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Geotools-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-devel

Reply via email to