Dear Christian,
Thanks for your suggestion.

With the function-lookup, my essential requirement is to process an incoming 
XML message containing a UUID and execute a particular function based on that 
UUID.  As  I would ideally like to be able to manage the associations between 
UUID and function names dynamically, I do not see immediately how to apply your 
suggestion.

There is a work-around along the lines of:
let $function_name := local:lookup-function-name($uuid)
let $def := concat( 
        "import module namespace ‘blah’  at ‘blah.xml’;
        declare variable $a  external;
        declare variable $b  external;
       ”, $function_name , “($a,$b)”)
return xquery:evalulate($def)

Although this is not particularly ideal as it uses an eval/evaluate statement 
(evil [1]).   Moreover, I was trying to replace an eval/evaluate statements 
with a function-lookup, as I assumed that this would be a more proper way to 
handle it, when I ran into the performance issue.
        
Besides reverting back to the eval statements, only one other option comes to 
mind: for a given set of pairs ($uuid,$function_name)  generate the needed 
xquery to invoke the functions with a  switch statement.   If I wanted to 
maintain at least a dynamic nature,  I suppose I could write this generated 
xquery to a file and use the repository module [2].  There are some immediate 
drawbacks that I see to this though.

So maybe my question is, how evil is evil?   If the eval’ed code is largely 
just calling existing functions, will there be a big performance impact?  If 
there are plans for optimize function-lookup in the future, I suppose I could 
live with a bit of short-term evil.

Cheers,
-carl

[1]  
https://mailman.uni-konstanz.de/pipermail/basex-talk/2013-November/005707.html
[2]  http://docs.basex.org/wiki/Repository_Module


On Feb 22, 2014, at 11:24 AM, Christian Grün <[email protected]> wrote:

> Hi Carl,
> 
> it would be generally possible to optimize the current implementation
> of function-lookup and related reflective functions, but I think it
> will take us some more time.
> 
> Instead, I rather recommend you to use function items, because these
> will always give you better performance and are less error-prone (they
> can be optimized much better than function calls based on string
> references).
> 
> I'm not sure how your complete code looks like (and it would probably
> be too complex to serve as example here), but the following code might
> give you a hint how this could look like:
> 
>  let $add := function($a) { $a + $a }
>  let $multiply := function($a) { $a * 2 }
>  for $f in ($add, $multiply)
>  return $f(2)
> 
> If you have already worked with function items... Sorry for teaching ;)
> 
> Christian
> 
> 
> 
> On Fri, Feb 21, 2014 at 5:06 PM, Carl Leitner <[email protected]> wrote:
>> Hi,
>> I noticed a significant performance degradation in the function-lookup 
>> method introduced at:
>>  
>> https://github.com/BaseXdb/basex/commit/4aeb4bdc74d980b4c8f2e27546d21fdc1ebaeb77
>> 
>> Where as at: b8b3dd2bee205303aeab3e8a0967b371a2ad7ef7 I have:
>>> xquery import module namespace csd_bsq = 
>>> "https://github.com/his-interop/openinfoman/csd_bsq"; at 
>>> "/Users/litlfred/pulsar_cats/openinfoman/repo/csd_base_stored_queries.xqm"; 
>>> let $r:= function-lookup(xs:QName('csd_bsq:facility_search'),2) return ()
>> Query executed in 22.57 ms.
>> 
>> At 4aeb4bdc74d980b4c8f2e27546d21fdc1ebaeb77 I have:
>>> xquery import module namespace csd_bsq = 
>>> "https://github.com/his-interop/openinfoman/csd_bsq"; at 
>>> "/Users/litlfred/pulsar_cats/openinfoman/repo/csd_base_stored_queries.xqm"; 
>>>  ()
>> Query executed in 17.48 ms.
>>> xquery import module namespace csd_bsq = 
>>> "https://github.com/his-interop/openinfoman/csd_bsq"; at 
>>> "/Users/litlfred/pulsar_cats/openinfoman/repo/csd_base_stored_queries.xqm"; 
>>> let $r:= xs:QName('csd_bsq:facility_search') return ()
>> Query executed in 20.44 ms.
>>> xquery import module namespace csd_bsq = 
>>> "https://github.com/his-interop/openinfoman/csd_bsq"; at 
>>> "/Users/litlfred/pulsar_cats/openinfoman/repo/csd_base_stored_queries.xqm"; 
>>> let $r:= function-lookup(xs:QName('csd_bsq:facility_search'),2) return ()
>> Query executed in 716.18 ms.
>> 
>> Any suggestions on how to avoid this?
>> 
>> Thanks so much.
>> 
>> Cheers,
>> -carl
>> 
>> 
>> 
>> _______________________________________________
>> BaseX-Talk mailing list
>> [email protected]
>> https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk

_______________________________________________
BaseX-Talk mailing list
[email protected]
https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk

Reply via email to