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