Passing sequence of strings to the java class

Saturday, 16 June 2018 · 8 messages · last reply 3 Jul 2018
AS
Alexander Shpack16 Jun 2018 21:56 #
Hey, team! Just simple question. How to pass sequence of string to the java class?
let $values := for $i in (1 to 3) return $i cast to xs:string
return j:exec($values)
In case when local function returns one item all is good. Otherwise j:exec takes array of item()+, but not the array of stings. If you just call j:exec(("1","2")) than all works as expected. Any thoughts? Is it bug or feature? ;) BaseX 9.0 Thanks!
-- s0rr0w
AS
Alexander Shpack23 Jun 2018 23:30 #
Hey, team! Just simple question. How to pass sequence of string to the java class?
let $values := for $i in (1 to 3) return $i cast to xs:string
return j:exec($values)
In case when local function returns one item all is good. Otherwise j:exec takes array of item()+, but not the array of stings. If you just call j:exec(("1","2")) than all works as expected. Any thoughts? Is it bug or feature? ;) BaseX 9.0 Thanks!
-- s0rr0w
CG
Christian Grünin reply to Alexander Shpack, 16 Jun 2018, 21:5629 Jun 2018 09:51 #
Hi Alex, How does the signature of the invoked Java function look like? Best, Christian
Quoted text · Alexander Shpack · 22 lines
On Mon, Jun 18, 2018 at 9:43 PM Alexander Shpack <shadowkin at gmail.com> wrote: > > Hey, team! > > Just simple question. How to pass sequence of string to the java class? > > let $values := for $i in (1 to 3) return $i cast to xs:string > return j:exec($values) > > In case when local function returns one item all is good. Otherwise j:exec takes array of item()+, but not the array of stings. > > If you just call j:exec(("1","2")) than all works as expected. > > Any thoughts? Is it bug or feature? ;) > > BaseX 9.0 > > Thanks! > > > -- > s0rr0w
AS
Alexander Shpack29 Jun 2018 12:29 #
Hi Christian, Right now we are using the next code
public static String exec(String key) {
    return ...
}

public static String exec(Object... keys) {
    return ...
}
The code that doesn't work:
public static String exec(*String*... keys)
Quoted text · Christian Grün · 36 lines
On Fri, Jun 29, 2018 at 10:51 AM Christian Grün <christian.gruen at gmail.com> wrote: > Hi Alex, > > How does the signature of the invoked Java function look like? > > Best, > Christian > > > > On Mon, Jun 18, 2018 at 9:43 PM Alexander Shpack <shadowkin at gmail.com> > wrote: > > > > Hey, team! > > > > Just simple question. How to pass sequence of string to the java class? > > > > let $values := for $i in (1 to 3) return $i cast to xs:string > > return j:exec($values) > > > > In case when local function returns one item all is good. Otherwise > j:exec takes array of item()+, but not the array of stings. > > > > If you just call j:exec(("1","2")) than all works as expected. > > > > Any thoughts? Is it bug or feature? ;) > > > > BaseX 9.0 > > > > Thanks! > > > > > > -- > > s0rr0w >
-- s0rr0w
CG
Christian Grün29 Jun 2018 12:33 #
I see! As XQuery sequences may contain items of arbitrary type, it is not always possible to decide at compile time which Java function needs to be chosen for evaluation. I recommend you to stick with the "Object..." declaration. Nevertheless, I will check if we can optimize the static function selection without compromising performance. Best, Christian
Quoted text · Alexander Shpack · 58 lines
On Fri, Jun 29, 2018 at 12:30 PM Alexander Shpack <shadowkin at gmail.com> wrote: > > Hi Christian, > > Right now we are using the next code > > public static String exec(String key) { > return ... > } > > public static String exec(Object... keys) { > return ... > } > > The code that doesn't work: > > public static String exec(String... keys) > > > > On Fri, Jun 29, 2018 at 10:51 AM Christian Grün <christian.gruen at gmail.com> wrote: >> >> Hi Alex, >> >> How does the signature of the invoked Java function look like? >> >> Best, >> Christian >> >> >> >> On Mon, Jun 18, 2018 at 9:43 PM Alexander Shpack <shadowkin at gmail.com> wrote: >> > >> > Hey, team! >> > >> > Just simple question. How to pass sequence of string to the java class? >> > >> > let $values := for $i in (1 to 3) return $i cast to xs:string >> > return j:exec($values) >> > >> > In case when local function returns one item all is good. Otherwise j:exec takes array of item()+, but not the array of stings. >> > >> > If you just call j:exec(("1","2")) than all works as expected. >> > >> > Any thoughts? Is it bug or feature? ;) >> > >> > BaseX 9.0 >> > >> > Thanks! >> > >> > >> > -- >> > s0rr0w > > > > -- > s0rr0w
AS
Alexander Shpack29 Jun 2018 12:37 #
Thanks!
Quoted text · Christian Grün · 79 lines
On Fri, Jun 29, 2018 at 1:34 PM Christian Grün <christian.gruen at gmail.com> wrote: > I see! As XQuery sequences may contain items of arbitrary type, it is > not always possible to decide at compile time which Java function > needs to be chosen for evaluation. I recommend you to stick with the > "Object..." declaration. > > Nevertheless, I will check if we can optimize the static function > selection without compromising performance. > > Best, > Christian > > > > On Fri, Jun 29, 2018 at 12:30 PM Alexander Shpack <shadowkin at gmail.com> > wrote: > > > > Hi Christian, > > > > Right now we are using the next code > > > > public static String exec(String key) { > > return ... > > } > > > > public static String exec(Object... keys) { > > return ... > > } > > > > The code that doesn't work: > > > > public static String exec(String... keys) > > > > > > > > On Fri, Jun 29, 2018 at 10:51 AM Christian Grün < > christian.gruen at gmail.com> wrote: > >> > >> Hi Alex, > >> > >> How does the signature of the invoked Java function look like? > >> > >> Best, > >> Christian > >> > >> > >> > >> On Mon, Jun 18, 2018 at 9:43 PM Alexander Shpack <shadowkin at gmail.com> > wrote: > >> > > >> > Hey, team! > >> > > >> > Just simple question. How to pass sequence of string to the java > class? > >> > > >> > let $values := for $i in (1 to 3) return $i cast to xs:string > >> > return j:exec($values) > >> > > >> > In case when local function returns one item all is good. Otherwise > j:exec takes array of item()+, but not the array of stings. > >> > > >> > If you just call j:exec(("1","2")) than all works as expected. > >> > > >> > Any thoughts? Is it bug or feature? ;) > >> > > >> > BaseX 9.0 > >> > > >> > Thanks! > >> > > >> > > >> > -- > >> > s0rr0w > > > > > > > > -- > > s0rr0w >
-- s0rr0w
CG
Christian Grün3 Jul 2018 11:51 #
Hi Alex, I found a solution indeed to improve type checking for Java function calls. Your code should now work with the latest snapshot [1]. There is a minor overhead when calling Java functions if the type is not statically known, but as long as your arrays don’t have millions of entries, you shouldn’t really notice the difference. I mostly revised the type checking process to reduce memory (e.g., a large byte array will be much smaller if passed on as byte[] instead of Object[]), so it is likely that most invocations will even be faster than before. The dynamic item type detection currently works for primitive types (double, float, boolean, int, short, byte) and Strings. Cheers, Christian [1] http://files.basex.org/releases/latest/
Quoted text · Alexander Shpack · 89 lines
On Fri, Jun 29, 2018 at 12:37 PM Alexander Shpack <shadowkin at gmail.com> wrote: > Thanks! > > On Fri, Jun 29, 2018 at 1:34 PM Christian Grün <christian.gruen at gmail.com> > wrote: > >> I see! As XQuery sequences may contain items of arbitrary type, it is >> not always possible to decide at compile time which Java function >> needs to be chosen for evaluation. I recommend you to stick with the >> "Object..." declaration. >> >> Nevertheless, I will check if we can optimize the static function >> selection without compromising performance. >> >> Best, >> Christian >> >> >> >> On Fri, Jun 29, 2018 at 12:30 PM Alexander Shpack <shadowkin at gmail.com> >> wrote: >> > >> > Hi Christian, >> > >> > Right now we are using the next code >> > >> > public static String exec(String key) { >> > return ... >> > } >> > >> > public static String exec(Object... keys) { >> > return ... >> > } >> > >> > The code that doesn't work: >> > >> > public static String exec(String... keys) >> > >> > >> > >> > On Fri, Jun 29, 2018 at 10:51 AM Christian Grün < >> christian.gruen at gmail.com> wrote: >> >> >> >> Hi Alex, >> >> >> >> How does the signature of the invoked Java function look like? >> >> >> >> Best, >> >> Christian >> >> >> >> >> >> >> >> On Mon, Jun 18, 2018 at 9:43 PM Alexander Shpack <shadowkin at gmail.com> >> wrote: >> >> > >> >> > Hey, team! >> >> > >> >> > Just simple question. How to pass sequence of string to the java >> class? >> >> > >> >> > let $values := for $i in (1 to 3) return $i cast to xs:string >> >> > return j:exec($values) >> >> > >> >> > In case when local function returns one item all is good. Otherwise >> j:exec takes array of item()+, but not the array of stings. >> >> > >> >> > If you just call j:exec(("1","2")) than all works as expected. >> >> > >> >> > Any thoughts? Is it bug or feature? ;) >> >> > >> >> > BaseX 9.0 >> >> > >> >> > Thanks! >> >> > >> >> > >> >> > -- >> >> > s0rr0w >> > >> > >> > >> > -- >> > s0rr0w >> > > > -- > s0rr0w >
AS
Alexander Shpack3 Jul 2018 12:04 #
Hi Christian, Thanks for the quick fix! Best wishes, Oleksandr
Quoted text · Christian Grün · 115 lines
On Tue, Jul 3, 2018 at 12:52 PM Christian Grün <christian.gruen at gmail.com> wrote: > Hi Alex, > > I found a solution indeed to improve type checking for Java function > calls. Your code should now work with the latest snapshot [1]. > > There is a minor overhead when calling Java functions if the type is not > statically known, but as long as your arrays don’t have millions of > entries, you shouldn’t really notice the difference. I mostly revised the > type checking process to reduce memory (e.g., a large byte array will be > much smaller if passed on as byte[] instead of Object[]), so it is likely > that most invocations will even be faster than before. > > The dynamic item type detection currently works for primitive types > (double, float, boolean, int, short, byte) and Strings. > > Cheers, > Christian > > [1] http://files.basex.org/releases/latest/ > > > > On Fri, Jun 29, 2018 at 12:37 PM Alexander Shpack <shadowkin at gmail.com> > wrote: > >> Thanks! >> >> On Fri, Jun 29, 2018 at 1:34 PM Christian Grün <christian.gruen at gmail.com> >> wrote: >> >>> I see! As XQuery sequences may contain items of arbitrary type, it is >>> not always possible to decide at compile time which Java function >>> needs to be chosen for evaluation. I recommend you to stick with the >>> "Object..." declaration. >>> >>> Nevertheless, I will check if we can optimize the static function >>> selection without compromising performance. >>> >>> Best, >>> Christian >>> >>> >>> >>> On Fri, Jun 29, 2018 at 12:30 PM Alexander Shpack <shadowkin at gmail.com> >>> wrote: >>> > >>> > Hi Christian, >>> > >>> > Right now we are using the next code >>> > >>> > public static String exec(String key) { >>> > return ... >>> > } >>> > >>> > public static String exec(Object... keys) { >>> > return ... >>> > } >>> > >>> > The code that doesn't work: >>> > >>> > public static String exec(String... keys) >>> > >>> > >>> > >>> > On Fri, Jun 29, 2018 at 10:51 AM Christian Grün < >>> christian.gruen at gmail.com> wrote: >>> >> >>> >> Hi Alex, >>> >> >>> >> How does the signature of the invoked Java function look like? >>> >> >>> >> Best, >>> >> Christian >>> >> >>> >> >>> >> >>> >> On Mon, Jun 18, 2018 at 9:43 PM Alexander Shpack <shadowkin at gmail.com> >>> wrote: >>> >> > >>> >> > Hey, team! >>> >> > >>> >> > Just simple question. How to pass sequence of string to the java >>> class? >>> >> > >>> >> > let $values := for $i in (1 to 3) return $i cast to xs:string >>> >> > return j:exec($values) >>> >> > >>> >> > In case when local function returns one item all is good. >>> Otherwise j:exec takes array of item()+, but not the array of stings. >>> >> > >>> >> > If you just call j:exec(("1","2")) than all works as expected. >>> >> > >>> >> > Any thoughts? Is it bug or feature? ;) >>> >> > >>> >> > BaseX 9.0 >>> >> > >>> >> > Thanks! >>> >> > >>> >> > >>> >> > -- >>> >> > s0rr0w >>> > >>> > >>> > >>> > -- >>> > s0rr0w >>> >> >> >> -- >> s0rr0w >> >
-- s0rr0w

⚡Generated with XQuery