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 <christian.gruen@gmail.com> 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 <litlfred@ibiblio.org> 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
BaseX-Talk@mailman.uni-konstanz.de
https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk