How can I bind an external variable to a sequence? I see the syntax trick for escaping commas, but I still don't get a bound sequence. I tried this:
import org.basex.core.*; import org.basex.core.cmd.*; import org.junit.*;
public class BindingTest {
String var = "$ids="; String seq = "('a',,'b',,'c')"; String query = "" + "declare variable $ids external; " + "let $count := count($ids) " + "return if($count gt 1) then element ids { $ids } " + "else error(QName('urn:err', 'not_enough_ids'), xs:string($count)) " ; /** * test binding external variable to sequence */ @Test public void test() { try { Context context = new Context(); new Set(Prop.BINDINGS, var + seq).execute(context); String result = new XQuery(query).execute(context); context.close(); System.out.println(result); } catch(Exception e) { System.err.println(e); } } }
I expect to get <ids>...</ids> but instead I get the error. I'm using v7.5, Java 7u13.
Hi Jeff,
the BINDINGS options can only be used to bind single items to variables. Some options to solve this problem are to..
– split your strings within the query, using a unique delimiter character..
declare variable $ids external; let $ids := tokenize($ids, "~") let $count := count($ids) return ...
– go one level deeper and create a QueryProcessor instance that gives you full access to the query architecture:
Context context = new Context(); String query = "declare variable $ids external; $ids"; QueryProcessor qp = new QueryProcessor(query, context); String[] vals = { "a", "b", "c" }; qp.bind("ids", vals); System.out.println(qp.value()); qp.close();
– have a look at the XQJ API (currently client/server-based, to be extended to local/embedded mode soon).
Hope this helps, Christian ___________________________
On Fri, Feb 8, 2013 at 4:54 PM, Lansing, Jeff J CIV SPAWARSYSCEN-PACIFIC, 56250 jeff.lansing@navy.mil wrote:
How can I bind an external variable to a sequence? I see the syntax trick for escaping commas, but I still don't get a bound sequence. I tried this:
import org.basex.core.*; import org.basex.core.cmd.*; import org.junit.*;
public class BindingTest {
String var = "$ids="; String seq = "('a',,'b',,'c')"; String query = "" + "declare variable $ids external; " + "let $count := count($ids) " + "return if($count gt 1) then element ids { $ids } " + "else error(QName('urn:err', 'not_enough_ids'), xs:string($count)) " ; /**
- test binding external variable to sequence
*/ @Test public void test() { try { Context context = new Context(); new Set(Prop.BINDINGS, var + seq).execute(context); String result = new XQuery(query).execute(context); context.close(); System.out.println(result); } catch(Exception e) { System.err.println(e); } } } I expect to get <ids>...</ids> but instead I get the error. I'm using v7.5, Java 7u13.
BaseX-Talk mailing list BaseX-Talk@mailman.uni-konstanz.de https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk
basex-talk@mailman.uni-konstanz.de