I think the answer will be to measure. As for the "cache" - I think we should
try the cache first; and if it works fine; if not we go and try the normal
technique (short listing accessors that canHandle; and then evaulating them)
Jody
On 08/09/2010, at 3:51 AM, Niels wrote:
> However, looking at it, there is another issue.
>
> AttributeExpressionImpl currently cashes its latest PropertyAccessor for
> performance reasons (as scanning the registry is very expensive).
>
> You can't do that anymore in the same way when we need to try multiple
> property accessors. We couldn't keep a cashe of a limited list of property
> accessors, because we loose the assumption that if we have one that 'can
> handle' the object, we don't need to try other ones anymore, we still need to
> check all the other ones.
>
> It is possible that we loose more performance this way, than by what I
> proposed earlier.
> This is a trade-off decision, but I am not sure which one is worst?
>
> Niels
>
> On 08/09/10 08:56, Niels wrote:
>>
>> I think your proposal is the most straight-forward way to solve the issue
>> without giving in on performance.
>>
>> However, the property accessor shouldn't return null but throw an exception
>> if the property doesn't exist, because there still should be a difference
>> between an actual null value and a non existing property.
>>
>> Niels
>>
>> On 07/09/10 20:04, Jody Garnett wrote:
>>>
>>> Hi Niels; we really need to keep discussion on the email list (as while my
>>> opinions may be helpful - they may not be correct).
>>> You may indeed have found a hole in the api; performing the work in
>>> canHandle method may still not be correct.
>>>
>>> Here is another idea; modify the look up code to go through all the
>>> property accessors; and short list XPathPropertyAccessor and
>>> ZPathPropertyAccessor. And then it can try both of them; and then if one of
>>> them returns non null...
>>>
>>> Jody
>>>
>>>
>>> On 07/09/2010, at 8:28 AM, Niels wrote:
>>>
>>>> Jody,
>>>>
>>>> I am still wondering about this.
>>>>
>>>> For example, say someone adds another PropertyAccessor, let's call it
>>>> ZPropertyAccessor.
>>>> It might come later in the list than XPathPropertyAccessor.
>>>>
>>>> The user specifies an attribute that can be evaluated by
>>>> ZPropertyAccessor. However, the string can also be interpreted as a valid
>>>> x-path, but it can't be evaluated as a property by the
>>>> XPathPropertyAccessor.
>>>>
>>>> The XPathPropertyAccessor will say "yes, I can handle this". But throw an
>>>> error as soon as it tries to evaluate it.
>>>>
>>>> ZPropertyAccessor will never be used. This will basically happen to any
>>>> accessor after XPathPropertyAccessor.
>>>>
>>>> That is why I think that, despite the performace issue,
>>>> XPathPropertyAccessor does have to check whether it can actually evaluate
>>>> the property in the canHandle method.
>>>>
>>>> What do you think?
>>>>
>>>> Thanks
>>>> Niels
>>>>
>>>> On 03/09/10 13:46, Niels wrote:
>>>>>
>>>>> Yes, you have a good point there about the performance because otherwise
>>>>> canHandle and evaluate are basically doing two times the same thing (the
>>>>> only way to check if the x-path points to a valid property is by trying
>>>>> to evaluate it).
>>>>>
>>>>> However, considering the API I'm not sure if you're right. The API for
>>>>> canHandle says "Can be used to perform checks against schema to ensure
>>>>> that the propery accessor will actually work with the provided instance.
>>>>> " SimpleFeaturePropertyAccessor does return canHandle=false for
>>>>> non-existing properties.
>>>>>
>>>>> The problem is: What if other property accessors are added in the future?
>>>>> They will never even be used if xpathpropertyaccessor comes before them
>>>>> in the list, returning an exception when maybe this other property
>>>>> accessor could still do the job. I think that is a theoretical
>>>>> possibility?
>>>>>
>>>>> Niels
>>>>>
>>>>> On 03/09/10 13:41, Jody Garnett wrote:
>>>>>>
>>>>>> Sounds good; one clarification for performance considerations.
>>>>>>
>>>>>> I am not sure the API will let you check the x-path against the feature
>>>>>> or feature type; the canHandle method is supposed to be fast; and should
>>>>>> just check that the xpath expression is valid.
>>>>>>
>>>>>> You will need to check that the xpath points to a property when the
>>>>>> expression is evaluated; at that point you could throw an exception (or
>>>>>> otherwise fail).
>>>>>>
>>>>>> Jody
>>>>>>
>>>>>> On 03/09/2010, at 3:11 PM, Niels wrote:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> Thanks for the advice.
>>>>>>>
>>>>>>> So my plan of attack will be:
>>>>>>>
>>>>>>> 1. Implement the 'canHandle' of class 'XPathPropertyAcessor' to make it
>>>>>>> return false when the x-path doesn't resolve to a property
>>>>>>> 2. Throw an exception in AttributeExpressionImpl.evaluate if no
>>>>>>> property accessor can be found.
>>>>>>> 3. Go through all the geotools test cases to be compatible with the
>>>>>>> changes.
>>>>>>>
>>>>>>> regards,
>>>>>>> Niels
>>>>>>>
>>>>>>> On 03/09/10 11:40, Jody Garnett wrote:
>>>>>>>>
>>>>>>>> I expect that JD (ie Justin's) comment was with respect to preserving
>>>>>>>> compatibility with the existing test cases when transitioning to the
>>>>>>>> GeoTools 2.3 Filter implementation (ie with Property Accessors).
>>>>>>>>
>>>>>>>> Now that the transition is mostly completed; throwing a good
>>>>>>>> exception is possible (but some work will be needed to update test
>>>>>>>> cases).
>>>>>>>>
>>>>>>>> This GeoTools 2.3 Filter transition is our oldest "technical debt") in
>>>>>>>> the library; there are a number of test cases that make use of the the
>>>>>>>> FilterImpl method directly (rather than using filter factory).
>>>>>>>>
>>>>>>>> Jody
>>>>>>>>
>>>>>>>> On Fri, Sep 3, 2010 at 1:36 PM, Jody Garnett <[email protected]>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> I think you could throw an exception there; and update the geotools
>>>>>>>>> test cases.
>>>>>>>>> Jody
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Thu, Sep 2, 2010 at 4:02 PM, Niels <[email protected]> wrote:
>>>>>>>>>
>>>>>>>>>> Hi,
>>>>>>>>>>
>>>>>>>>>> I am a new geotools developer who just started working on app-schema
>>>>>>>>>> for
>>>>>>>>>> CSIRO last week.
>>>>>>>>>> I was asked to look at this problem:
>>>>>>>>>> http://jira.codehaus.org/browse/GEOT-3066 ("No error is returned if
>>>>>>>>>> I gave
>>>>>>>>>> an invalid column name in app-schema mapping file").
>>>>>>>>>>
>>>>>>>>>> I discovered the issue is intertwined with other parts of the
>>>>>>>>>> geotools code.
>>>>>>>>>> The issue is in the evaluation of expressions, more specifically in
>>>>>>>>>> the
>>>>>>>>>> AttributeExpressionImpl class. The evaluate method will return a
>>>>>>>>>> null value
>>>>>>>>>> when it cannot evaluate the attribute expression. This makes it
>>>>>>>>>> impossible
>>>>>>>>>> for App-schema to distinguish between an actual attribute with a
>>>>>>>>>> real null
>>>>>>>>>> value and a non-existing attribute. I think an evaluation method
>>>>>>>>>> should in
>>>>>>>>>> principle distinguish between an expression that cannot be evaluated
>>>>>>>>>> and an
>>>>>>>>>> expression that evaluates to a null value. However, there are
>>>>>>>>>> explicit
>>>>>>>>>> comments in the code that say this would cause issues with backward
>>>>>>>>>> compatibility:
>>>>>>>>>>
>>>>>>>>>> public Object evaluate(Object obj, Class target) {
>>>>>>>>>> PropertyAccessor accessor = getPropertyAccessor(obj, target);
>>>>>>>>>>
>>>>>>>>>> if ( accessor == null ) {
>>>>>>>>>> return null; //JD:not throwing exception to remain
>>>>>>>>>> backwards
>>>>>>>>>> compatabile, just returnign null
>>>>>>>>>> }
>>>>>>>>>> Object value = accessor.get( obj, attPath, target );
>>>>>>>>>>
>>>>>>>>>> if(target == null)
>>>>>>>>>> return value;
>>>>>>>>>>
>>>>>>>>>> return Converters.convert( value, target );
>>>>>>>>>>
>>>>>>>>>> }
>>>>>>>>>> Although I am not sure why, because the FunctionExpressionImpl class
>>>>>>>>>> does
>>>>>>>>>> throw exceptions when it cannot evaluate.
>>>>>>>>>> I considered bypassing the evaluate method altogether from
>>>>>>>>>> app-schema for
>>>>>>>>>> the mapping, but this is not a serious option because expressions
>>>>>>>>>> can be
>>>>>>>>>> quite complex, with functions etc. and all that functionality cannot
>>>>>>>>>> be
>>>>>>>>>> lost.
>>>>>>>>>>
>>>>>>>>>> I think the most optimal solution that respects backward
>>>>>>>>>> compatibility,
>>>>>>>>>> would be to introduce some flag somewhere that can turn error
>>>>>>>>>> checking on
>>>>>>>>>> for the evaluation of attribute expressions (but is off by default).
>>>>>>>>>> My
>>>>>>>>>> first idea to implement this is : creating an alternative
>>>>>>>>>> implementation of
>>>>>>>>>> AttributeExpression, and then passing an optional boolean value to
>>>>>>>>>> the CQL
>>>>>>>>>> compiler that specifies which attribute expression implementation to
>>>>>>>>>> use.
>>>>>>>>>> Ben Caradoc-Davies however suggested the use of the 'Hints', but I
>>>>>>>>>> am not
>>>>>>>>>> familiar yet with how this exactly works.
>>>>>>>>>>
>>>>>>>>>> What are your thoughts?
>>>>>>>>>>
>>>>>>>>>> One more thing, another issue that would need to be resolved is in
>>>>>>>>>> the
>>>>>>>>>> XPathPropertyAccessor class in the xml package.
>>>>>>>>>> When evaluating an attribute expression, an iteration through all
>>>>>>>>>> property
>>>>>>>>>> accessors determines which one to use.
>>>>>>>>>> When an invalid column name is specified, he will end up with
>>>>>>>>>> XPathPropertyAccessor as last choice. The problem is this code:
>>>>>>>>>> JXPathContext context =
>>>>>>>>>> JXPathContextFactory.newInstance().newContext(null, object);
>>>>>>>>>> context.setLenient(true);
>>>>>>>>>>
>>>>>>>>>> The Lenient property will make sure that no exception is thrown if
>>>>>>>>>> the xpath
>>>>>>>>>> cannot be resolved and a null is returned instead, again making it
>>>>>>>>>> impossible to distinguish between an error and a real null value. I
>>>>>>>>>> don't
>>>>>>>>>> know why it was chosen to do it this way?
>>>>>>>>>> That too would need to change.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> With Regards,
>>>>>>>>>> Niels
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Niels Charlier
>>>>>>>>>>
>>>>>>>>>> Software Engineer
>>>>>>>>>> CSIRO Earth Science and Resource Engineering
>>>>>>>>>> Phone: +61 8 6436 8914
>>>>>>>>>>
>>>>>>>>>> Australian Resources Research Centre
>>>>>>>>>> 26 Dick Perry Avenue, Kensington WA 6151
>>>>>>>>>>
>>>>>>>>>> ------------------------------------------------------------------------------
>>>>>>>>>> This SF.net Dev2Dev email is sponsored by:
>>>>>>>>>>
>>>>>>>>>> Show off your parallel programming skills.
>>>>>>>>>> Enter the Intel(R) Threading Challenge 2010.
>>>>>>>>>> http://p.sf.net/sfu/intel-thread-sfd
>>>>>>>>>> _______________________________________________
>>>>>>>>>> Geotools-devel mailing list
>>>>>>>>>> [email protected]
>>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/geotools-devel
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Niels Charlier
>>>>>>>
>>>>>>> Software Engineer
>>>>>>> CSIRO Earth Science and Resource Engineering
>>>>>>> Phone: +61 8 6436 8914
>>>>>>>
>>>>>>> Australian Resources Research Centre
>>>>>>> 26 Dick Perry Avenue, Kensington WA 6151
>>>>>>> ------------------------------------------------------------------------------
>>>>>>> This SF.net Dev2Dev email is sponsored by:
>>>>>>>
>>>>>>> Show off your parallel programming skills.
>>>>>>> Enter the Intel(R) Threading Challenge 2010.
>>>>>>> http://p.sf.net/sfu/intel-thread-sfd_______________________________________________
>>>>>>> Geotools-devel mailing list
>>>>>>> [email protected]
>>>>>>> https://lists.sourceforge.net/lists/listinfo/geotools-devel
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Niels Charlier
>>>>>
>>>>> Software Engineer
>>>>> CSIRO Earth Science and Resource Engineering
>>>>> Phone: +61 8 6436 8914
>>>>>
>>>>> Australian Resources Research Centre
>>>>> 26 Dick Perry Avenue, Kensington WA 6151
>>>>
>>>>
>>>> --
>>>> Niels Charlier
>>>>
>>>> Software Engineer
>>>> CSIRO Earth Science and Resource Engineering
>>>> Phone: +61 8 6436 8914
>>>>
>>>> Australian Resources Research Centre
>>>> 26 Dick Perry Avenue, Kensington WA 6151
>>>
>>
>>
>> --
>> Niels Charlier
>>
>> Software Engineer
>> CSIRO Earth Science and Resource Engineering
>> Phone: +61 8 6436 8914
>>
>> Australian Resources Research Centre
>> 26 Dick Perry Avenue, Kensington WA 6151
>
>
> --
> Niels Charlier
>
> Software Engineer
> CSIRO Earth Science and Resource Engineering
> Phone: +61 8 6436 8914
>
> Australian Resources Research Centre
> 26 Dick Perry Avenue, Kensington WA 6151
> ------------------------------------------------------------------------------
> This SF.net Dev2Dev email is sponsored by:
>
> Show off your parallel programming skills.
> Enter the Intel(R) Threading Challenge 2010.
> http://p.sf.net/sfu/intel-thread-sfd_______________________________________________
> Geotools-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/geotools-devel
------------------------------------------------------------------------------
This SF.net Dev2Dev email is sponsored by:
Show off your parallel programming skills.
Enter the Intel(R) Threading Challenge 2010.
http://p.sf.net/sfu/intel-thread-sfd
_______________________________________________
Geotools-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-devel